c+指针运算

main(){

     charstr1[]={'a','b','c','d'};
     charstr2[3][2] = {{'1','e'},{'q','d'},{'g','h'}};
     char*p_str1 = "123456";
    printf("%c \r\n",str1[1]);
    printf("%c \r\n",*(str1+1));
    printf("%c \r\n",*(*(str2+1)+1));
    printf("%s \r\n",p_str1+1);
    printf("%c \r\n",*(p_str1+1));
    printf("%c \r\n",p_str1[1]);
     return0;
  }
 
结果:
23456
2
2
 
 
怎么理解 str1[]  和 *?
[] 和 * 都有两个意义和作用,体现在定义和运算上。[] 在定义的时候表示当前定义的是一个数组,*在定义的时候表示当前定义的是一个指针。str1[]中的str1表示数组第一个元素的指针,我们不必把指针看得如此神秘他与一般变量毫无差别只是他里面存的是一个地址整数而已,而且指针还可以进行特殊运行。
 
假如一个指针为p那么p只是他的表示符他在符号表中对应的内存位置为54321111,这个内存的位置存有另一个地址,*p就是取到指针指向的内存里面的值。p+1是怎么回事呢?假如p的值为54321111,那么p+1=54321112么?不是的奥,指针的加法运算并不是简单的算数运算首先指针要看自己指向的变量类型,假如该类型为x在内存占位为8,那么p+1应该为p+8*1。
我们看下 char str2[3][2] ={{'1','e'},{'q','d'},{'g','h'}}; 首先str2就是整个数组首元素的指针,str2+1就得到了第二个数组的指针,*(str2+1)就得到了这个指针里面的内容,这里面的内容是啥呢,因为这是个二维数组所以,这里面的内容还是个指针,*(*(str2+1)+1)这样就取到d了。
 
str1[2] 实际做了什么呢 ?
在定义的时候他在说明str1是一个指向有两个元素的首指针;在运算的时候它实际完成了*(str1+2)这个计算(当然我们指的取值运算时)。也就是说   指针[x] = *(指针+x) 这两个是完全相等的运算。
posted @ 2016-03-15 17:25  神不知鬼不晓  阅读(365)  评论(0编辑  收藏  举报