【关于指针】
& 地址运算符 *指针运算符或间接寻址运算符
1.指针的一个很重要的用途:作为实参传给函数.
2.注意下面两条语句:
a=*p++; a=(*p)++;
由于*和++运算符属于同级,是右结合的。所以第一个相当于“a=*(p++);”又因为++运算符位于变量p的后面,所以是后缀运算,,所以 a=*p++;相当于a=*p;p=p+1;
而第二条语句a=(*p)++;相当于a=*p;*p=*p+1;
3.数和数组的指针
在函数的形参和实参中,
如果一个数要做指针传递,
形参 void Fuc(void *a);实参 Fuc(&a);
而数组时void a[N];
形参 void Fuc(void a[]);实参 Fuc(a);
4.字符指针
以字符数组和字符指针对比
char str[10]={"china"}; char *ptr="china";
str代表字符串在内存中的首地址。
ptr代表指向字符串"china"首地址的一个指针。ptr==str;
对于字符指针赋值,必须让指针指向一个数组的首地址。
对于字符数组的首地址,是常量不能改变,用*(str+i)方式引用,对于字符指针可以改变可以通过*(ptr+i)或者*(++ptr)方式引用
5.二维数组的指针引用
char str[5][5], *p;
对于二维数组中的某个值str[2][2]的引用可以直接写成cout<<*(*(str+2)+2);用二维数组名直接引用。
也可以采用
p=a[2]; *(p+2);方式
或者可以
p=*str; *(p+2*5+2)
**注意一点,不要误写成p=str;这样就成了第一行的首地址了,而不是第一行的第一列的值的地址。。
**还有一种用【行数组指针】的写法
char (*p)[5]; p=str;这样p就和数组名str一样可以用cout<<*(*(p+2)+2)方法引用了
str[0]==*str==&str[0][0];
【关于二维数组指针的误区】
a[5][5];
要吧a和a[0]区分开,虽然都是首地址,但是指向的对象不同。a[0]指的是二维数组中一维数组的首地址,对它进行寻址运算得到的是一个 数组值,即a[0]数组的第一个元素的值a[0][0].可是a是一个数组的名字它指向的是所属元素的首元素。对他寻址得到的是首元素a[0][5] 是一个一维数组。所以二者不可混淆。
行数组指针定义成char (*p)[5];它代表的是*p有5个char型的元素分别指向(*p)[0],(*p)[1],(*p)[2],(*p)[3],(*p)[4],即指向5个char型数组
p ——>|str[0][0]|str[0][1]|............
p+1——>|str[1][0]|str[1][1]|............
p+2——>|str[3][0]|str[3][1]|............
..........................