这几天对C语言的指针温习了下,感觉理解又更深入了一步
C语言的精髓是指针我想确实一点都不错,但是在使用的时候有很多要注意的地方,大概总结一下:
1.指针指向常量区,是不能修改其值的
比如:
char *p ="abcfd";
char *ptr ="abcfd";
*(p+1) ='C'; //此时会报错,因为"abcfd"为常量区,其值是无法修改的
解决方法用字符数组来解决
char p[100]="abcfd";
*(p+1) ='C';
char p[100]="abcfd"和char *p ="abcfd"在于前者为变量空间,可以简单的理解为将"abcfd"这个常量在变量区做了一份拷贝赋给数组p[100]
后者则是直接将指针指向存储于常量去的字符串.
p和ptr则指向相同的内存地址
2.数组名所代表的指针是无法修改的,因为其本身是一个常量
比如:
char p[100]="abcfd";
*(p++) ='C';//此时会报错,因为p为常量,不能进行自加动作
3.指针数组其保存的值是同维度数组的地址,而不是值
比如:
int a[2][2]={{1,2},{3,4}};
int (*p)[2]=a;
*(*p+1) 表示的a[0][1]
*(p+1) 表示的是a[1][0]的地址
*(p+1)[1] 表示的a[1][1]的地址
*p 表示存储的a[0][0]
4.p 和 *p的区别
比如:
int a=2;
int b=5;
int *p =&a;
*p =5;
*p = b;
p的值为保存a的地址 *p表示以p里存储的地址所指向的内存的值 *p =5和*p = b则表示将p所指向的内存地址的值修改为5 或b
5.指针之间的算术运算是基于指针类型所定
比如:
int a[5]={0,1,2,3,4};
int *p,*q;
p=q =a;
p++;
p-q ==1//此时则为1
(char *)p -(char *)q ==4 //此时则为4
6.&array和array的区别
&array其所赋的指针为数组指针 arra则表示的是指针
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1)); //输出为2,5
///
int a[2][2]={1,2,3,4};
int *ptr=(int *)(&a+1); //可以理解为将a的值加上一个sizeof(int a[][])
printf("%d"*(ptr-1)); //输出为4
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
&a是数组指针,其类型为 int (*)[5];
7.多级指针和多级数组的概念相同
比如:
int a[2][2]={1,2,3,4};
*a表示的是一维数组0所在的地址
*(a+1)表示的一维数组1所在的地址
**a表示的是a[0][0]的值
*(a+1)[1]表示的是a[1][1]的值
8.指针类型和指针所指向的类型
指针的类型
你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
(1)int*ptr;//指针的类型是int*
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
指针所指向的类型
当你通过指针来访问指针所指向的内存区域数据 你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
(1)int*ptr;//指针所指向的类型是int
(2)char*ptr;//指针所指向的的类型是char
(3)int**ptr;//指针所指向的的类型是int*
(4)int(*ptr)[3];//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
9.指针和数组的初始化
指针可以在申明后,进行初始化
数组必须在申明的时候进行初始化
比如:
char *p="fds"; <--------> char *p; p ="fds";
char p[12];p=”Visual C++”; 这样赋值就是错误的,原因是P此时为常量的数组名,为只读
10.数组的&和不用&的区别
对数组进行&运算表示的是取以数组类型的指针,对其进行进一步运算的基础以数组类型为单位
而不用&直接操作数组名,只是取数组成员
比如:
char p[]="fdsf";
*(p+1) 则表示取'd‘
11.指向数组的指针,可以理解为二级指针,
比如:
int a[4][2] ={1,2,3,4,5,6,7,8};
int (*p)[4];
p =a;
printf("%d",p[1][2]); //为7
printf("%d %d",p[1],*p[1]); //分别为5的地址和5
12.多维数组的表示方式,可以理解为同等维度的指针
比如:
static int b[3][2]={1,3,5,7,9,11}; //可以将b理解为int (*b)[2]
访问具体元素的方式为 b[m][n],同样可以为*(*(b+m)+n)
13.sizeof的区别
sizeof来测量指针,始终为4(根据具体字长) <当指针作为形参传入函数内部,其sizeof的值也固定为4,而不论指针类型>
还有很多要注意的地方,暂时先记在这,楼下的朋友可以进一步补充.