一使用指针的三步骤
1;定义一个指针变量
2;明确指针的指向,这一步必不可少
3;操作指针指向的空间;
char *p ;
*p = 'H';这种写法是错误的,原因是因为指针的指向不明确;
int *p;
char value = 'n';
p = &value;
*p++; //相当于先取p的地址然后再p++,表达式的结果为*p
p++;//指针的是指向向后偏移一个char(数据类型);
(*p)++;相当于value++,指针的指向没有变,相当于value++表达式结果为p++之前取值
++(*p);相当于++value,指针的指向没有变,表达式的结果为++p之后取*取值
二级指针
int a= 10;
int *p=&a;
int **q=&p;
q++;//指针的指向改变为指向在p后面加一个int*类型大小的空间的首地址
*q++;//相当于先取出*p的值,然后q++ 指针指向改变了
(*q)++;//相当于p++;指针指向改变了
p++;//相当于p指向a后面一个int类型的大小的空间的首地址
*p++;//相当于先取*p的值,然后p++
(*p)++;//相当于a++
指针和一位数组
char str[]={"hello word"};
int *p = str;
等价关系str[i]<==>*(str+i)<==>p[i]<==>*(p+i);
区别:str是常量 p是变量
char *p = "helloworld";
char a[] = "helloworld";
char *str;
char b[32];
p++;//正确的,相当于p的指针向后偏移了一个char
*p++;//正确的,相当于先取*p 然后再p++;表达式返回的结果为*p
(*p)++;//错误的,常量区的内容不允许被修改,
*p = 'H';//错误的,常量区的内容不允许被修改;
p = "hqyj";//正确的,指针的指向可以改变
a++;//错误的,数组名是常量 不能++
*a++;//错误的,a不能++;数组名不能++
(*a)++;//正确的,相当于a【0】++
*a = 'H';//正确的,相当于a【0】='H';;;a = "hqyj";//错误的,a是数组名不能被赋值
str++;//正确的,指针的指向向后偏移一个char
*str = 'H';错误的,常量区的内容不允许被修改
str = p;//正确的,指针变量间的相互赋值
*str = 'H';错误的,常量区的内容不允许被修改
b = a;错误的,b也是数组名不能被赋值,数组一点定义好了就不能修该
指针数组
本质是一个数组,数组中每一个元素都是一个指针
char *s[4] = {"./a.out", "hello", "world", "beijing"};
//s是一个指针数组 每个元素都是一个 char * 类型的指针
//s[0]指向 "./a.out" //s[1]指向 "hello"
//s[2]指向 "world"
//s[3]指向 "beijing"
printf("%s\n", s[1]);//hello
printf("%s\n", *(s+2));//world
printf("%c\n", *(*(s+3)+3));//'j'
printf("%c\n", s[3][3]); //'j'
数组指针本质是一个一个指针,指向一个二维数组,也叫行指针
int s[2][3] = {1,2,3,4,5,6};
int (*p)[3] = s;//定义了一个行指针p指向 二维数组s
等价关系: s[i][j] <==> *(s[i]+j) <==> *(*(s+i)+j) <== ==> p[i][j] <==> *(p[i]+j) <==> *(*(p+i)+j) 区别: s 是常量 p 是变量 p++;
//p的操作空间是 3个int 所以p++ 相当于p偏移了 12个字节 *p+1;
//*p 操作空间是 1个int 所以 *p+1 是 第0行第1个元素的地址 *(*p+1);//第0行第1个元素