现在的位置: 首页 > 综合 > 正文

关于C语言指针【第一季】

2018年05月25日 ⁄ 综合 ⁄ 共 1374字 ⁄ 字号 评论关闭
【关于指针】
& 地址运算符  *指针运算符或间接寻址运算符
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]|............
             ..........................

抱歉!评论已关闭.