int array[10];
int *pa;
pa=&a;//&a是一个指针表达式 。
int **ptr=&pa;//&pa也是一个指针表达式 。
*ptr=&b;//*ptr和&b都是指针表达式 。
pa=array;
pa++;//这也是指针表达式 。
例七:
char *arr[20];
char **parr=arr;//如果把arr看作指针的话 , arr也是指针表达式
char *str;
str=*parr;//*parr是指针表达式
str=*(parr+1);//*(parr+1)是指针表达式
str=*(parr+2);//*(parr+2)是指针表达式
由于指针表达式的结果是一个指针 , 所以指针表达式也具有指针所具有的四
个要素:指针的类型 , 指针所指向的类型 , 指针指向的内存区 , 指针自身占据的
内存 。
好了 , 当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存
的话 , 这个指针表达式就是一个左值 , 否则就不是一个左值 。
在例七中 , &a不是一个左值 , 因为它还没有占据明确的内存 。*ptr是一个左
值 , 因为*ptr这个指针已经占据了内存 , 其实*ptr就是指针pa , 既然pa已经在内
存中有了自己的位置 , 那么*ptr当然也有了自己的位置 。
第五章 数组和指针的关系
如果对声明数组的语句不太明白的话 , 请参阅我前段时间贴出的文?lt;<如何
理解c和c++的复杂类型声明>> 。
数组的数组名其实可以看作一个指针 。看下例:
例八:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=https://www.isolves.com/it/cxkf/yy/C/2019-09-06/array[0];//也可写成:value=*array;
value=https://www.isolves.com/it/cxkf/yy/C/2019-09-06/array[3];//也可写成:value=*(array+3);
value=https://www.isolves.com/it/cxkf/yy/C/2019-09-06/array[4];//也可写成:value=*(array+4);
上例中 , 一般而言数组名array代表数组本身 , 类型是int [10] , 但如果把a
rray看做指针的话 , 它指向数组的第0个单元 , 类型是int * , 所指向的类型是数
组单元的类型即int 。因此*array等于0就一点也不奇怪了 。同理 , array+3是一个
指向数组第3个单元的指针 , 所以*(array+3)等于3 。其它依此类推 。
例九:
例九:
char *str[3]={
"Hello,this is a sample!",
"Hi,good morning.",
"Hello world"
};
char s[80];
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
上例中 , str是一个三单元的数组 , 该数组的每个单元都是一个指针 , 这些指
针各指向一个字符串 。把指针数组名str当作一个指针的话 , 它指向数组的第0号
单元 , 它的类型是char** , 它指向的类型是char * 。
*str也是一个指针 , 它的类型是char* , 它所指向的类型是char , 它指向的地
址是字符串"Hello,this is a sample!"的第一个字符的地址 , 即’H’的地址 。
str+1也是一个指针 , 它指向数组的第1号单元 , 它的类型是char** , 它指向
的类型是char * 。
*(str+1)也是一个指针 , 它的类型是char* , 它所指向的类型是char , 它指向
"Hi,good morning."的第一个字符’H’ , 等等 。
下面总结一下数组的数组名的问题 。声明了一个数组TYPE array[n] , 则数组
名称array就有了两重含义:第一 , 它代表整个数组 , 它的类型是TYPE [n];第二
, 它是一个指针 , 该指针的类型是TYPE* , 该指针指向的类型是TYPE , 也就是数组
单元的类型 , 该指针指向的内存区就是数组第0号单元 , 该指针自己占有单独的内
存区 , 注意它和数组第0号单元占据的内存区是不同的 。该指针的值是不能修改的
, 即类似array++的表达式是错误的 。
在不同的表达式中数组名array可以扮演不同的角色 。
在表达式sizeof(array)中 , 数组名array代表数组本身 , 故这时sizeof函数
测出的是整个数组的大小 。
在表达式*array中 , array扮演的是指针 , 因此这个表达式的结果就是数组第
推荐阅读
- 华为交换机SVF介绍
- 茶多酚含量排行哪些因素会影响鲜叶的茶多酚含量
- 过期茶叶的八大妙用扔掉了又怪可惜的
- 怎样搭高质量的Android项目框架,框架的结构具体描述?
- 茶叶多少钱斤算好的 依据个人经济能力和不同的口味进行选择
- JS刷新当前页面的几种方法总结
- 蒸茶和煮茶的区别蒸茶壶和煮茶壶使用时的区别
- 初识JS中的作用域和闭包
- 建水紫陶壶有哪些缺点由于建水紫陶壸特殊的材质
- SEM跳出率高怎么办?