指针和数组
1.指针数组
用来存放指针的数组被称为指针数组,它要求存放在数组中的指针的数据类型必须一致。
指针数组是一种数组,里面的元素是指针,定义如下:
int * arr[5];
2.数组指针
数组指针是能够指向数组的指针。 是一种指针,定义如下:
int arr[10]={10,20,30,40,50};
int (*ptr)[10]=&arr;
数组指针常用于动态分配二维数组或操作二维数组的行。
- 对于指针数组,
ptrArray[0][0]
等价于*(*(ptrArray + 0) + 0)
,即*ptrArray[0]
。- 对于二维数组,
matrix[0][0]
等价于*(*(matrix + 0) + 0)
,即matrix[0][0]
。
区别
尽管语法上相似,但指针数组和二维数组在内存布局和使用上有本质区别:
- 指针数组:存储的是指向不同内存地址的指针,这些指针可以指向不同的内存区域。
- 二维数组:存储的是一个连续的内存块,所有元素按行优先顺序排列。
3.字符数组和字符指针以及字符指针数组
3.1 字符数组
字符数组是存放字符的数组,是一个数组
可以修改数组里面单个元素的值,但是不能整体修改数组(数组名是常量)
3.2字符指针
字符指针是指向字符数组的指针,是一个指针,是变量
可以对该指针整体修改,但不能对里面的单个元素修改
函数和指针
1.函数形参是指针
将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,可以修改原变量的值
传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量
传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。
这种修改会影响函数外部的变量
2.指针函数
返回值是指针的函数,定义如下:
指针函数的定义的一般格式
返回值类型 * 函数名(形参列表){
函数体
}
函数体中的 return 命令返回一个地址
一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针。
函数名 代表函数的入口地址
3.函数指针
指向函数的指针,是一个指针
一个函数本身就是一段内存里的代码,总是占用一段连续的内存区域。这段内存区域也有首地址,把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。
简单来说,函数指针,就是指向函数的指针
格式:
返回值类型 (*指针变量名)(参数列表)
其中,参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称。