指针
指针就是地址,地址就是指针,地址是内存单元的编号.
指针变量是存放地址的变量
指针与地址:
指针有类型,地址没有类型
地址只是读取的开始,类型是读取到什么位置结束
注意:一般不要给指针赋值为一个int类型的地址,操作系统不允许访问
指针的长度
int * ipoit;
char* arr;
printf("%d",sizeof(ipoint)); // 4
printf("%d",sizeof(arr)); // 4
多级指针
定义一级指针指向i的地址
int i = 100;
int* address1 = &i;
二级指针指向address1的地址
int** address2 = &address1;
三级指针指向address2的地址
int*** address3 = &address2;
四级指针指向三级指针的地址
int**** address4 = &address3;
如下:
printf("%#d",***adress4);// 1000H
printf("%d",****adress4);// 100
函数指针
指向函数的指针,有三个部分组成
函数返回值类型 函数指针名称 函数的参数列表
int (*fun_p) (int a,char* t);
int add(int a,int) {
return a + b;
}
int dec(int a,int b) {
return a - b;
}
void msg(int(*p)(int a,int b),int m,int n) {
int result = p(m,n);
printf("%d",result);
}
main() {
// 定义函数指针
int (*cadd)(int x,int y);
cadd = add;
//使用函数指针
int result = cadd(99,1);
printf("%d",result);//100
// 类似于Java里面的回调函数
msg(add,10,20);
msg(dec,20,10);
}
数组
数组是一块连续的地址空间
取地址值
数组的地址值与首元素地址一样
char cArr[] = {'A','B','C'};
printf("%#x",&cArr); // 0x2000
printf("%#x",&cArr[0]); // 0x2000
printf("%#x",&cArr[1]); // 0x2001
printf("%#x",&cArr+0); // 0x2000 一般不要这么取
下面取与上面等价
printf("%#x",cArr+0); //
printf("%#x",cArr+1); //
printf("%#x",cArr+2); //
int数组
int iArr[] = {1,2,3};
printf("%#x",&iArr); // 0x2000
printf("%#x",&iArr[0]); // 0x2000
printf("%#x",&iArr[1]); // 0x2004
printf("%#x",&(iArr+2)); // 0x2008
iArr+2:表示移到下一个地址单元,int移4个字节,char移1个字节