文章来源:http://www.top-e.org/jiaoshi/html/?415.html
c语言的灵魂——指针(2) |
北京顶嵌嵌入式培训机构 2009-09-17 13:53:00 作者:赵老师 来源:顶嵌技术部 文字大小:[大][中][小] |
c语言的灵魂——指针二
【2】char*ptr; //指针所指向的的类型是char 【3】int**ptr; //指针所指向的的类型是int* 【4】int(*ptr)[3]; //指针所指向的的类型是int()[3] 【5】int*(*ptr)[4]; //指针所指向的的类型是int*()[4] 在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C 越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。 (3)指针的值 或者叫指针所指向的内存区或地址指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?(重点注意) (4)指针本身所占据的内存区 指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32 位平台里,指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。
5. &和* &和*是和指针和地址相关的两个符号,使用它们时可能会有两种含义在不同的场合含义不同。
(1) 当用于声明一个变量时: *表示:声明的该整数指向某个内存地址,一次访问sizeof(type)长度。
&表示:在C++程序声明变量的时候的&,只是表明该声明的变量是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址。
(2) 当用于操作一个变量时: *表示:这样一种操作,该操作返回以他后面变量值为地址的内存空间存储的值。
&表示:这样一种操作,该操作的返回值是他后面的变量在声明时分配给该变量的地址空间。
举例: int * p; 这里的*表示声明的变量是一个指针型变量。 *p=5; 这里的*表示以该变量值为地址所表示的内存空间存储的值为5;
int &p; 这里的&表示声明的变量p为一个引用变量。 int *p=&a; 这里的&表示对变量a进行取址操作,将地址付给p。
6. 容易混淆的指针相关概念 (1) 指针数组和数组指针 如果细心的话,这两者之间是很好区分的。指针数组的本质是数组,数组指针的本质是指针这一点可以从优先级进行判断。 例如: int *p[3]; 首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组
int (*p)[3]; 首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针
(2) 指针函数和函数指针 指针函数和函数指针的区分方法和数组指针与指针数组的区分方法一致利用优先级很容易进行区分。 int (*p)(int); 从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针
int *p(int); 从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针.所以P 是一个参数为一个整数据且返回一个指向整型数据的指针的函数.
以上就是我对C语言指针的认识,我想要想学好C语言不能只顾理论,理论源于实践在实践中摸索总结理论知识我想会更有效也会有更多新的收获。 |