1. 字符指针变量
在C语言中,字符串通常被视为字符数组,但它们可以有不同的表示方式。字符指针变量存储的是字符串的地址。这意味着,当你有一个字符串时,你可以通过改变字符指针的值来改变这个字符串,因为你实际上改变的是它指向的内存地址。
一般使用方式为:
int main()
{
const char* pstr = "hello word.";//这⾥是把⼀个字符串放到pstr指针变量⾥了吗?
printf("%s\n", pstr);
return 0;
}
这一个代码我们很容易理解为把字符串“hello word”放到字符指针pstr里,但是本质上是把字符串hello word”中的首个字符‘h’的地址放入了指针pstr里。
2. 数组指针变量
2.1 数组指针变量是什么?
学习了指针数组后,我们知道指针数组是⼀种数组,数组中存放的是地址(指针)。
数组指针变量是指针变量?还是数组?
答案是:指针变量。
数组指针变量是一个特殊类型的指针,它用来存储数组的地址。更准确地说,数组指针是指向数组的指针,这意味着它指向一个内存区域,该区域包含一系列相同类型的数据元素。
在C语言中,数组名本身就是一个指向数组首元素的指针。例如,如果你有一个整数数组 int arr[10];,那么 arr 就是一个指向数组首元素的指针,即 int *arr = &arr[0];。
2.2 数组指针变量怎么初始化
数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?
如果要存放个数组的地址,就得存放在数组指针变量中,如下:
这就完成了数组指针的初始化 。不过有意思的是,上面所讲的字符指针变量储存的是第一个字符的地址,数组指针变量储存的是数字中第一个整型的位置。为了防止记忆错误,这里可以讲两个变量去类似记忆。
3. ⼆维数组传参的本质
在C语言中,二维数组传参的本质是通过指针传递数组的地址。当函数接受一个二维数组作为参数时,实际上接收的是指向数组首元素的指针。这意味着,函数中的参数是一个指针,它指向原始数组的第一个元素。
让我们来看一个例子:
在这个例子中,printArray 函数接受一个指向整型数组的指针作为参数,该数组有10个元素。这个指针指向数组的第一个元素 arr[0][0]。函数中的 rows 参数用于知道数组有多少行。
当我们在 main 函数中调用 printArray(arr, 3); 时,实际上传递的是 arr 数组的首元素地址。在 printArray 函数中,array 指针指向的是 arr[0][0],因此我们可以通过 array[i][j] 访问原始数组的元素。
总结来说,二维数组传参的本质是通过指针传递数组的地址,使得函数能够直接访问和操作原始数组的元素。这种传参方式在C语言中是非常常见的,因为它提供了对数组元素直接操作的灵活性,并且可以节省内存空间。
4. 函数指针变量
4.1 函数指针变量的创建
了解了整型指针,数组指针,通过类比关系,不难得出结论:
函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。
那么函数是否有地址呢?
输出结果如下:
确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的⽅式获得函数的地址。
如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针⾮常类似。如下:
函数指针类型分析:
4.2 函数指针变量的使用
通过函数指针调⽤指针指向的函数:
输出结果为:
5. 函数指针数组
函数指针数组是一种特殊类型的数组,其元素是函数指针。这种数组可以存储多个函数的指针,每个指针指向一个特定的函数。函数指针数组在需要多个函数但不确定哪个函数将被调用的场合非常有用,例如,在游戏编程中,根据玩家的选择调用不同的游戏功能,或者在菜单驱动的程序中,根据用户的选择执行不同的操作。
那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
答案是:parr1
parr1 先和 [ ] 结合,说明parr1是数组,数组的内容是什么呢?
是 int ( * )( ) 类型的函数指针。