c语言函数指针的指针 c语言函数指针的指针是什么( 三 )


*p=24;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a 。
ptr=p;//p的结果是个指针,该指针的类型是p的类型加个*,在这里是int** 。该指针所指向的类型是p的类型,这里是int* 。该指针所指向的
地址就是指针p自己的地址 。
*ptr=b;//*ptr是个指针 , b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的 , 所以?amp;b来给*ptr赋值就是毫无问题的了

**ptr=34;//*ptr的结果是ptr所指向的东西 , 在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量 。
第四章 。指针表达式 。
一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式 。下面是一些指针表达式的例子:
例六:
int a,b;
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当然也有了自己的位置 。
第五章 。数组和指针的关系
如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文章如何理解c和c++的复杂类型声明 。数组的数组名其实可以看作一个
指针 。看下例:
例八:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=https://www.04ip.com/post/array[0];//也可写成:value=*array;
value=https://www.04ip.com/post/array[3];//也可写成:value=*(array+3);
value=https://www.04ip.com/post/array[4];//也可写成:value=*(array+4);
上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第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 * 。

推荐阅读