首页 > 其他分享 >C语言深度复习【数组和指针】

C语言深度复习【数组和指针】

时间:2024-08-30 18:23:26浏览次数:16  
标签:10 const 复习 int C语言 数组 ptr 指针

目录

一.数组和指针

1.1 数组指针

1.2 指针数组

1.3 函数指针

1.4 const和指针

1.5 sizeof和指针和数组

1.6 strlen和字符数组


一.数组和指针

1.1 数组指针

  • 一个数组指针实际上是指指向数组的指针。当你有一个数组类型作为函数参数时,它在函数内部被当作一个指针来处理。
  • 例如,int (*pArray)[10] 声明了一个指向含有10个整数的数组的指针。
  • [ ] 的优先级要高于*号的,所以必须加上()来保证p先和*结合
  • 通常用于函数参数,以传递整个数组。由于数组在函数参数中退化为指针,返回数组的函数可以返回一个数组指针
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*pArray)[10] = &arr; // pArray是一个指向含有10个整数的数组的指针

1.2 指针数组

  • 一个指针数组是一个数组,其元素是指针。
  • 例如,int *pointerArray[5] 声明了一个包含5个指向整数的指针的数组
  • 当你需要一个可以动态改变其元素的数组时使用,每个元素可以独立地指向不同的数据或内存地址
int numbers[] = {0, 1, 2, 3, 4};
int *pointerArray[] = {&numbers[0], &numbers[1], &numbers[2], &numbers[3], &numbers[4]};

1.3 函数指针

return_type (*pointer_name)(parameter_list);
  • return_type 是函数返回值的数据类型。
  • pointer_name 是指针变量的名称。
  • parameter_list 是函数参数的列表,包括参数的类型和顺序。
#include<stdio.h>

int add(int a, int b)
{
	return a + b;
}

int sub(int a, int b)
{
	return a - b;
}

int main()
{
	int (*function_ptr)(int, int);// 声明一个函数指针
	function_ptr = add;//将函数指针指向 add 函数
	printf("%d\n", function_ptr(3, 5));// 通过函数指针调用 add 函数
	function_ptr = sub;
	printf("%d\n", function_ptr(3, 5));
}

1.4 const和指针

  • const type *ptr; 表示指针指向的数据是常量,但指针本身可以改变。
  • type *const ptr; 表示指针本身是常量,但可以通过指针修改数据。
  • const type *const ptr; 表示指针本身和指向的数据都是常量。
int main()
{
	const int num = 10;
	const int* ptr = &num;
	// *ptr = 20; // 错误:不能通过指向常量的指针修改数据

	int num2 = 10;
	int num3 = 20;
	int* const ptr1 = &num2;
	// ptr1 = &num3; // 错误:不能改变指针的值
	*ptr1 = 30; // 正确:可以通过指针修改数据
	
	const int num4 = 10;
	const int* const ptr2 = &num4;
	// ptr2 = &some_other_int; // 错误:不能改变指针的值
	// *ptr2 = 20; // 错误:不能通过指向常量的指针修改数据
}

1.5 sizeof和指针和数组

  • sizeof 对于数组返回整个数组的大小。
  • sizeof 对于指针返回指针本身的大小。
  • 对于指向数组的指针,sizeof 在编译时返回指针的大小,而在运行时返回数组的大小。
  • sizeof 对于指针数组返回整个指针数组的大小。
void func(int arr[10]) 
{
	printf("%zu\n", sizeof(arr)); // 这里输出的是指针的大小,不是数组的大小
}

int main()
{
	int arr[10];
	printf("%zu\n", sizeof(arr)); // 输出整个数组的大小,这里是 10 个 int 的大小

	func(arr);

	int* p;
	printf("%zu\n", sizeof(p)); // 输出指针的大小,通常是 4 或 8 个字节

	int array[10];
	int(*ptr)[10] = &array;
	printf("%zu\n", sizeof(*ptr)); // 输出数组的大小
	printf("%zu\n", sizeof(ptr));  // 输出指针的大小

	int* arr1[10] ;
	printf("%zu\n", sizeof(arr1)); // 输出指针数组的大小
}

1.6 strlen和字符数组

size_t strlen(const char *str);

strlen 是 C 语言标准库函数,定义在 <string.h> 头文件中,用于计算一个以空字符 '\0' 结尾的字符串的长度。strlen 函数不计算终止的空字符。

当您有一个字符数组并且该数组存储了一个字符串时,您可以使用 strlen 来获取字符串的长度。

#include <stdio.h>
#include <string.h>

int main() {
    char myString[] = "Hello, World!";
    size_t length = strlen(myString); // 计算字符串长度,不包括终止的 '\0'
    printf("长度为: %zu\n", length);
    return 0;
}

注意事项:

  • strlen 只能用于以空字符 '\0' 结尾的字符串。如果字符数组中没有空字符,strlen 可能会进入无限循环,因为它会尝试找到字符串的结束标志。
  • strlen 函数的时间复杂度是 O(n),其中 n 是字符串的长度,因为它需要逐个字符检查直到找到空字符。

标签:10,const,复习,int,C语言,数组,ptr,指针
From: https://blog.csdn.net/weixin_55582891/article/details/141721432

相关文章

  • 使用ClassLoader.getSystemResource更新上线后空指针异常
     目录 问题描述:原问题代码:问题原因以及解决思路:解决方法:问题描述:项目中使用到一个功能,于是在资源路径下加了点依赖包:更新上线后,发现使用ClassLoader.getSystemResource("dependencies")找不到依赖包原问题代码:URLresourceURL=ClassLoader.getSystemResource(......
  • 分享丨【题单】链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)
    作者:灵茶山艾府链接:https://leetcode.cn/circle/discuss/K0n2gO/一、链表注:由于周赛中的链表题可以转成数组处理,难度比直接处理链表低,故不标明难度分。带着问题去做下面的题目:在什么情况下,要用到哨兵节点(dummynode)?在什么情况下,循环条件要写while(node!=null)?什么情况......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • C语言详细笔记--构造数据类型(结构体数组)
    目录一、结构体数组的定义二、结构体数组的初始化三、结构体数组的引用一、结构体数组的定义structstuscoretype{intstuid;intscore[3];doubleaverage;};structstuscoretypestu[3];上面语句定义了一个名为stu的数组,数组有三个元素,每个元素的类......
  • 算法: 双指针
    题目:环形链表题目讲解:判断环要判断链表是否有环,可以使用快慢指针的方法。快指针每次走两步,慢指针每次走一步。如果链表有环,快慢指针最终会相遇;如果没有环,快指针会先到达链表末尾。为什么快指针走两步,慢指针走一步?因为这样快指针会更快进入环,并在环中追上慢指针。具体来说,......
  • 2023数据结构408程序题C语言
    如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素;否则输出-1。#include<stdio.h>#include<stdlib.h>//定义结构体数组S,其中的元......
  • C语言基础——函数详解
    目录 函数的概述1函数的概念2函数的意义 函数的定义和使用1函数的定义2函数的调用2.1在同一文件中函数定义后函数调用2.2在同一文件中函数定义前函数调用2.3调用其它文件中定义的函数2.3.1在函数调用文件中进行声明2.3.2在头文件中进行函数的声明 函......
  • 智能指针
    智能指针在C++中管理动态内存可以使用new和delete,但通过这种方式得到的指针(裸指针)是容易忘记释放的进而导致内存泄漏。因此C++标准中提供了智能指针shared_ptr,weak_ptr和unique_ptr来进行动态内存的管理。智能指针的设计满足了RAII(ResourceAcquisitionIsInitialization)的特......
  • 王道C语言(备份)
    指针与一维数组函数调用的本质是值传递数组传递是弱化为指针如果指针变量已指向数组中的一个元素,则p+1指向同一数组的下一个元素,执行p+1并不是将p的值(地址)加1,而是加上一个数组元素所占用的字节数。#include<stdio.h>intmain(){ inta[3]={2,7,8}; int*p; intj;......
  • C语言 备份
    scanf读取原理行缓冲:标准缓存区读入字符‘20\n’,会打印输出20,紧接着的scanf,会打印输出\n,标准输入缓冲区有\n,scanf(c=%c,&c),直接读取缓冲区的\n字符输出。scanf匹配规则:scanf函数在读取整型数、浮点数、字符串会忽略'\n'字符判断闰年#include<stdio.h>intmain(){ in......