指针
指针分为:
字符指针,指针数组,数组指针
字符数组:是用于存放字符的指针
指针数组:是存放指针的数组
数组指针:是指向数组的指针,存放的是数组的地址
第一个arr,因为数组名表示首元素的地址,是int*类型,加一的话,就是往后加4个字节
第二个&arr【0】表示的是首元素的地址,也是int*类型,加一的话,就是往后加4个字节
第三个&arr是取出整个数组放在了指针,而它的类型是int(*)【10】=arr,加一的话,就是加上一整个数组的长度
&arr,这里的数组名表示的是整个数组,取出的是整个数组的地址,从地址值的角度和数组首元素的地址是一样的,他们的意义是完全不同的,
二维数组的数组名也是首元素的地址,但是二维数组的首元素是第一行的整个一维数组,所以使用函数传参传的是第一行的一维数组,
二维数组传参使用指针,这里的int(*arr)【4】是指传过去的是arr这个指针,每个指针是4个元素,都是int类型
函数指针:
int (*pf)(int , int)= add//函数的地址要存放起来,就得放在函数指针变量中
函数的类型,函数指针的名字,函数传参的类型
函数名就是函数的地址,和&函数是一样的,
函数指针数组;
就是在函数指针的基础上在函数名后面加上数组大小
int (* p【10】)(int,int)= {函数1,函数2,函数3,函数4}
指向函数指针数组的指针;
取出函数指针数组的地址,放在一个指针变量里
int (*pfarr[4])(int ,int ) = {ADD, SUB};
ppfarr = &pfarr //ppfarr是一个指向函数指针数组的指针
int (*(*ppfarr)[4])(int ,int ) = &pfarr;//先把ppfarr作为一个单独的指针,指向一个数组,类型就是函数指针
回调函数:
使用函数调用函数指针调用函数
数组名的意义:
数组名单独在sizeof里面,这里的数组名就直接表示整个数组,计算的是整个数组的大小
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
除此之外,其他的数组名都表示首元素的地址
第一个是计算整个二维数组的大小
第二个是计算第一行第一个元素的大小
第三个是计算第一行的大小
第四个是计算第一行第二个元素的大小
第五个是计算第一行第二个元素的大小,因为a[0]+1是找到第一行第二个元素的地址,解引用是访问第二个元素
第六个是计算第二行的地址,因为a代表首元素的地址,在二维数组中首元素的地址表示第一行的地址,所以+1是表示第二行的地址,不管是计算什么类型的地址都是4/8字节
第七个是计算第二行全部元素的大小,因为a代表首元素的地址,在二维数组中首元素的地址表示第一行的地址,所以+1是表示第二行的地址,解引用访问第二行的元素
二维数组的存储也是连续的
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |