您的位置:首页 > 编程语言 > C语言/C++

第二学期C语言复习资料

2011-01-27 15:58 225 查看
C语言的复习资料(要结合作业本)

6-1——6-3


6-1

C语言里储存信息的地址带:

上面每一小段就是存放数据的地址(整型的小段要存放整型的地址,浮点的要存放浮点的(因为不同类型的小段有不同的容量))

(变量的指针,其含义是该变量的地址(储存该变量地址的一个变量))


一、小复习下:

int m 定义 一个整型变量m,它的地址被申请在地址段A(也就是它的地址是地址段A),以后它的值就被存放在地址段A上

int *p 又定义一个指向整型变量的指针变量p,什么也没有的

m=3 给m一个值:3

p=&m 通过取地址符号&,把m的地址给指针变量p,那指针变量p里存放的值就是地址段A,而通过取值符号*则可以取到A地址段上的值

也就是说*p和m完全等价,而且把*p的值改了,那m的值也就变了,因为它们的值都存放在同一个地址:地址段A上

(注意:p是一个地址,而*p是一个地址上的值)
(p里面存放了变量m的地址,则可以说指针变量p指向了m)
(int *p里的*和*p=3里的*是两种完全不同意思,前者单单是为了定义、说明p是一个指针变量用的,没有具体意义;而后者是用来取值用的,*p是一个值)

相关题目:6-1:2、3、4


二、关于数组:

int a[5] 定义了一个数组a

int *p1 再定义一个指针变量

数组名a是比较特别的,它就是一个地址,是这个数组首元素的地址,它与&a[0]等价,类似的与&(a[2]-2)等价

那么把p1=a以后p1和a就完全等价了,a+4等于p1+4(都是数组元素a[4]的地址),*(a+2)等于*(p1+2)(都是元素a[2]的值), 只是指针变量p1可以p1=p1+1,而数组名a是不可以改变

(注意:因为这里a[5]是不存在的,所以类似的*(p1+5)是非法引用)
(a已经是地址了,不能再对它用取地址符号&了如&a)
(*p1++和*(p1++):在这里加不加括号其实都一样,都是先取出地址p1上的值,p1再加一个一
*++p1则是p1先加1再读取出地址p1加1以后上面的值)
( (*p)++是先取出*p的值,*p的值再加1,
++(*p)是*p的值先加1,再取出*p加1以后的值 )
相关题目:6-1:5、6、7,6-2:大部分题目

三、赋值的注意

*p=3是为一个指针变量所指向的变量赋值,可是如果指针变量p事先没有指向谁,那这个值要给谁呢?

所以一般来说指针变量在这样为变量赋值之前,要先有一个确定的地址可以接收(就是要先赋给指针变量一个变量的地址)
例如
int *p,m=5,n;
*p=m;
是错的(这里p里没有确定的地址,m赋值时p的地址就是随机的,这样对程序的隐患很大)

int *p,m=5,n;
p=&n;
*p=m;
就对了(这里p里的地址是变量n的地址,那*p=m之后n就等于3了)
(这里的n在定义时不需要有没有等于几的,它只要是int定义过以后就会有一个具体的地址的)(类似的如果是指针变量int *p之后p里面是不会有具体地址的,所以需要上面的方法)
(注意:scanf(”d%”,@)里面的@一定要是一个地址,只要是一个地址就行了)

相关题目:6-1提高题:1、2、3、4、5的D选项(仔细思考一下)
6-2
6-3

一、二维数组


二维数组和前面的一维数组是完全不同的,比如二维数组里*(a+1)不是一个值而是一个地址了,所以不能用一维数组的知识来解释二维数组了

二维数组就像一个柜子,要取出里面的元素就必须要知道元素的行和列

*(a+2)是第2行首元素的地址
(相当于*(a+2)+0)

而单单的a+2是第二行的首地址
(a既是第0行的首地址,又是数组名)

它们都是地址

于是对它们用取地值符号*后结果是

*(*(a+2))是第2行首元素的值

*(a+2)是第2行首元素的地址

总结下来,要知道二维数组某行某列的值,就要先知道某行某列的地址是多少,而计算地址的方式就是 第几行元素的首地址+第几列
所以元素E的地址就是*(a+1)+0,也就是*(a+1), 所以它的值是**(a+1)
元素B的地址就是*(a+1)+2, 所以它的值是*(*(a+1)+2)
元素C的地址就是*(a+3)+2, 所以它的值是*(*(a+3)+2)
元素D的地址就是*(a+3)+4, 所以它的值是*(*(a+3)+4)
元素A的地址就是*(a+0)+0,也就是*a, 所以它的值是**a
至于单单的a+1之类的,知道是第几行的地址就行了,其它没有什么联系的

最后,二维数组里*(a+1)是和a[1]等价的(都是第1行首元素的地址)
类似的*(a+3) 是和a[3]等价的,*a是和a[0]等价的

更进一步*(*(a+3)+4)是和a[3][4]等价的,*(*(a+1)+2)是和a[1][2]等价的,
当然*(*(a+1)+2和*(a[1]+2)也是等价的
**(a+1)是和a[1][0]等价的,**a是和a[0][0]等价的

相关题目:6-3:1、2、7、8等
二、指向一维数组的指针(行指针)
之前的指针的定义方法都是int *p

而行指针的定义方法是int (*p)[3]

对比一下 int *p 元素指针
int (*p)[3] 行指针
发现区别只是后面多加一个大括号而已,至于小括号只是为了让*p依然是一个整体才加的([]的优先级比*高),没有具体意义

二维数组中出现了这两种指针,它们的使用有什么区别呢?

首先只要是int (*p)[3] 这种类型定义的指针再加一个p=a语句,指针p就可以完全代换上一页中的a,比如*(*(a+1)+2和*(*(p+1)+2完全等价,当然p必须等于a

而int *p类型的指针,它是一个单独的指针,所以任何的地址(不论几行几列的元素地址)都可以赋给它,但是取它的地址也只能用*p的方式,而不能用上面的*(*(p+1)+2方式了,如果把p=a,那可以一直一直*p++把整个二维数组取完(像6-3第10题一样)

行指针唯一要注意的就是如果二维数组是a[3][4],那int (*p)[] 大括号里的数就必须是4,
如果二维数组是a[3][2],那int (*p)[] 大括号里的数就必须是2了

相关题目:6-3:3、4、5、6、9等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: