立即注册 登录
光电工程师社区 返回首页

microunit的个人空间 http://club.oecr.com/?67401 [收藏] [复制] [分享] [RSS]

日志

C指针

已有 661 次阅读2008-12-12 00:10 |个人分类:学习日志|

四要素
1)指针的类型
2)指针所指向的类型
3)指针的值
即指针所指向的内存区域首址.
指针所指向的内存区域, 就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区域.
4)指针本身所占的内存区域
用函数sizeof(指针的类型)计算,在判断一个指针表达式是否是左值时很有用.

类型
1)普通指针变量(略)
2)指向数组的指针变量
2-1)一维数组指针变量(略)
2-2)二维数组指针变量
设有整型二维数组a[3][4],C语言允许把一个二维数组分解为多个一维数组来处理,因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。其中
a[0]是第一个一维数组的数组名和首地址,并且a[0], &a[0], &a[0][0], a,   *(a+0), *a是等效的。
a[1]是第二个一维数组的数组名和首地址,并且a[1], &a[1], &a[1][0], a+1, *(a+1)是等效的。
a[2]是第三个一维数组的数组名和首地址,并且a[2], &a[2], &a[2][0], a+2, *(a+2)是等效的。
由此可得出:a[i], &a[i], &a[i][0], a+i, *(a+i)是等同的。

另外,a[0]+0是一维数组a[0]的0号元素的首地址,a[0]+1则是a[0]的1号元素首地址,
由此可得出: a[i]+j 是一维数组a[i]的j号元素首地址,它等价于&a[i][j]。

另外,由a[i]=*(a+i)得到: a[i]+j=*(a+i)+j
由于*(a+i)+j是二维数组a的i行j列元素的首地址。该元素的值等于*(*(a+i)+j)。

设p为指向二维数组的指针变量, 定义为int (*p)[4]; 赋值为p=a;
它表示p是一个指针变量,它指向二维数组a 或指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。
而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i行j列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。

二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量名)[长度] 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。 “长度”表示二维数组分解为多个一维数组时, 一维数组的长度,也就是二维数组的列数。应注意“(*指针变量名)”两边的括号不可少,如缺少括号则表示是指针数组

3)指向结构的指针变量(略)
要注意的问题:C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。
4)指向指针的指针变量(略)
5)指向函数的指针变量
The right-left rule:
Start reading the declaration from the innermost parentheses, go right, and then go left.
When you encounter parentheses, the direction should be reversed.
Once everything in the parentheses has been parsed, jump out of it.
Continue untill the whole declaration has been parsed.
例一: int (*func)(int *p);
(*func)表示func是一个指针变量
(*func)(int *p)表示func是一个指向函数的指针变量,即函数指针
int (*func)(int *p)表示func是函数指针,此函数返回int类型
例二: int (*func[5])(int *p);
(*func[5])表示func是一个数组,此数组长度为5,此数组元素类型为指针,即指针数组
(*func[5])(int *p)表示func是指针数组,每个指针是一个函数指针
int (*func[5])(int *p)表示func是指针数组,每个指针是一个函数指针,此函数返回int类型
注意: 这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高.
例三: int (*(*func)[5])(int *p);
(*func)表示func是一个指针变量
(*(*func)[5])表示func是一个指向二维数组的指针变量, 此二维数组的列数为5, 此二维数组的元素类型为指针
(*(*func)[5])(int *p)表示func是一个指向二维数组的指针变量, 此二维数组的列数为5, 此二维数组的元素类型为指针,每个指针是一个函数指针
int (*(*func)[5])(int *p)表示func是一个指向二维数组的指针变量, 此二维数组的列数为5, 此二维数组的元素类型为指针,每个指针是一个函数指针,此函数返回int类型
例四: int (*(*func)(int *p))[5];
(*func)指针
(*func)(int *p)函数指针
(*(*func)(int *p))函数指针返回值是指针
(*(*func)(int *p))[5]函数指针返回值是指向二维数组的指针,此二维数组的列数为5
int (*(*func)(int *p))[5]函数指针返回值是指向二维数组的指针,此二维数组的列数为5, 此二维数组的元素为int类型


用typedef来对声明逐层分解,增强可读性.
例如对于声明:int (*(*func)(int *p))[5];可以这样分解:
typedef int (*PARA)[5];
typedef PARA (*func)(int *);
这样就容易看得多了。


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

QQ|手机版|搜索|焦点光学|光电工程师社区 ( 鄂ICP备17021725号-1 鄂网安备42011102000821号 )  

Copyright 2015 光电工程师社区 版权所有 All Rights Reserved.

申明:本站为非盈利性公益个人网站,已关闭注册功能,本站所有内容均为网络收集整理,不代表本站立场。如您对某些内容有质疑或不快,请及时联系我们处理!  

© 2001-2022 光电工程师社区    网站备案号:鄂ICP备17021725号  网站公安备案号:鄂42011102000821号    Powered by Discuz! X3.2

GMT+8, 2025-12-25 22:28

返回顶部