C语言复习:数组和指针
目录
1.数组指针
2.指针数组
3.函数指针
4.const和指针
5.sizeof和指针和数组
6.strlem和数组
1.数组指针
(1)首先我们得理解什么是数组指针?
答:在数组指针中间我们加一个‘的’就可以很显而易见的发现,“数组的指针”,也就是指向数组的指针
如下图是一个很简单的一维数组指针的应用:
(2)数组指针常用于二维数组的创建和操作。下面我们来探讨二维数组指针的具体应用。
图中括号内的*表示 p
是一个指针,指向一个由 2个整数组成的数组 - 这正是变量 arr
中每个一维数组的类型。
由于()的优先级高于*,必须使用括号。若直接写成 int *p[2]
,则会被解释为 int *(p[2])
,此时 p
就变成了指针数组,而非指向二维数组的指针。
此外,还存在着一个至关重要的等价关系:
arr+i == p+i
arr[i] == p[i] == *(arr+i) == *(p+i)
arr[i][j] == p[i][j] == *(arr[i]+j) == *(p[i]+j) == *(*(arr+i)+j) == *(*(p+i)+j)
2.指针数组
(1)首先我们得理解什么是指针数组?
答:指针数组是一种特殊的数组,其元素均为指针。每个数组元素存储的是内存地址,而非直接的数据值。
它的一般形式为:
int a = 1, b = 2;
int *ptr_arr[2] = {&a, &b}; // 指针数组存储变量地址
printf("%d", *ptr_arr[0]); // 输出1
3.函数指针
(1)掌握函数指针的概念至关重要
函数指针是一种指向函数的指针变量,存储函数的入口地址。通过函数指针可以间接调用函数,实现动态绑定或回调机制。其类型由函数的返回值类型和参数列表决定。
由下图所示可知函数名就是函数的地址,当然也可以通过&函数名的方法获得函数的地址
函数指针的基本应用示例如下:
函数指针类型解析:
函数指针的应用:
下图为输出的结果:
4.const和指针
(1)首先我们需要明确const的作用是什么?
变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。
上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我 们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。
但是如果我们绕过n,使用n的地址,去修改n就能做到了,虽然这样做是在打破语法规则。
下图为输出的结果:
我们可以看到这里⼀个确实修改了,但是我们还是要思考⼀下,为什么n要被const修饰呢?就是为了 不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让 p拿到n的地址也不能修改n,那接下来怎么做呢?
(2)const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本身的内容可变。
const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。
5.sizeof和指针和数组
在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。 sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
1. sizeof是操作符
2. sizeof计算操作数所占内存的大小, 单位是字节
3. 不关注内存中存放什么
6.strlem和数组
strlen 是C语言库函数,功能是求字符串长度。函数原型如下
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在越界查找。
1. strlen是库函数,使用需要包含头文件 string.h
2. srtlen是求字符串长度的,统计的是 \0 之前字符的隔个数
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界