定义:char *a;
定义解释:定义的类型根据指针想要指向内存地址的对应类型选择
int main(){
int a=66;;
int *b;
b = &a;
printf("%d",*b); //66
}
解释:
b=&a;是将a对应的内存地址保存到指针b;printf("%d",*b);‘*’在定义时是申明指针类型,在其它地方表示取地址对应的实际存储数据解释:数组指针与指针数组有一定的区别,数组指针主要是为了类型的对应,指针数组主要是数组里面放着许多指针
int main() {
int b[] = { 11,21,31,41,51 };
int* c;
c = b;
printf("%d\n", *c); //11
printf("%d\n", *(c + 1)); //21
printf("%d\n", *c + 1); // 12
}
解释:
c=b;b没有加取地址符号,因为数组本身就是保存的数组首地址;printf("%d",*c);数组本身,在这里就是c保存的数组首地址也就是c[0]的地址,故打印出11printf("%d\n", *(c + 1));c+1实际是增加一个对应类型的长度,比如int增加4,char增加1(实际在此就是找到下一个也就是21) printf("%d\n", *c + 1);优先级问题‘*’优先级高,故先取出11然后为其+1注意:二维数组需要用数组指针对应
int main() {
int a[2][3] = { {11,55,66000},{555,888,9999} };
int (* b)[3]; //这就是数组指针
b = a;
printf("%d\n", **b);//11
printf("%d\n", **(b+1));//555
printf("%d", *(*b+2));//66000
}
解释:
printf("%d\n", **b); 解释:‘*’是右结合,先*b表示到{11,55,66000}再加*具体到第一位上printf("%d\n", **(b+1));解释:先*(b+1)到{555,888,9999}然后再加*具体到第一位上printf("%d", *(*b+2));解释:先(*b+2)到{11,55,66000}然后再加*具体到第三位格式:char *a[10]
解释:是指一个数组里面装着n个指针(这里就是10个char*),也即指针数组是一个数组
前要:字符串指针跟前面两个有所不同
const char* a = "abcdefg";
printf("%s", a);
区别:字符串指针把字符串存储在常量区,且char *a只是保存ancdefg的首地址**,常量区意味着字符串指针不能修改**,数组字符串(cahr a[10]="abc")存储在全局数据区或栈区,可以修改
int main() {
const char* a = "abcdefg";
char b[] = "a12226";
a[2] = 'd'; //错误 常量区
b[5] = 'c';//正确 全局数据区或栈区
}
特点:字符串指针可以重新指向
int main() {
const char* a = "abcdefg";
printf("%s\n", a);// abcdefg
a = "123456aa";
printf("%s", a);// 123456aa
}