其实这两个东西挺难理解的,应该也没有那么重要,了解一下好了,主要还是要多多理解数组指针的运算
最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷>
先说说a和&a的区别(有三点,三个方向):
声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧。
a叫做数组名,是数组首元素的地址,也就是&a[0]的值。像是一个指针类型,是一个int型的指针类型,int *,先理解成指针吧。
&a这才是一个真正的指针,是一个数组指针。是数组的地址。
切记:&a不是指向指针的指针,因为&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一样,说明*&a仅仅是对这个数组指针进行了取值,取得的是数组的值,即数组首元素的地址,而不是对&a这个地址进行了取值。这个应该是c语言中针对数组指针运算的规定。
这里的数组指针&a取值之后,变成了a,是a,不是*a,变成了这个数组的数组名,或者说是数组首元素的地址。
这句没有像常规的一样对&a进行取值,而是强制类型转换了一下,可见这个不是一个指向指针的指针。
二维数组中的利用指针来遍历的方式,也不是一个指向指针的指针(2级指针) ,这句printf("%d\n", *(*(a+i) + j)); *(a+i)也就是将数组指针取值获得数组的首元素地址,常常的误区就是数组指针的取值运算和普通的指针取值运算不一样。数组指针取值运算类似一个强制类型转换的过程。
注意:二维数组的数组名a,是***个一维数组的数组指针,*a就是***个一维数组的数组名。也可以直接用tpye *强制类型转换。
华清美女学霸总结了一些C语言指针习题,比较全面,对这方面有困难的可以看看。
1.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是___B____.
a)*p表示的是指针变量p的地址
b)*p表示的是变量a的值,而不是变量a的地址
c)*p表示的是指针变量p的值
d)*p只能用来说明p是一个指针变量
2.若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是___A___
程序运行后的输出结果是 B
执行后的输出结果是 C
A)p向高地址移了四个字节 B)p向高地址移了一个存储单元
C)p向高地址移了两个字节 D)p与a+1等价
7.若有以下定义,则对a数组元素的正确引用是___D______.
程序运行后的输出结果是( A ) ++ 的优先级高于 *
13.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引
不能给数组a输入字符串的语句是(B)
16.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是(C)
a)a+1表示的是字符t的地址b)p指向另外的字符串时,字符串的长度不受限制c)p变量中存放的地址值可以改变d)a中只能存放10个字符
程序运行后的输出结果是__B___。
22.下段代码的运行结果是:D
}会正常输出但有越界的错误
23.下段程序的运行结果是 :B
24.下列选项中声明了一个指针数组的是:E
25.下面代码能通过编译的是:A
A) pa是一个指向数组的指针,所指向的数组是5个int型元素
B) pa是一个指向某数组中第5个元素的指针,该元素是int型变量
C) pa [5]表示某个元素的第5个元素的值
D) pa是一个具有5个元素的指针数组,每个元素是一个int*型指针
27、若有以下定义,且0≤i<4,则不正确的赋值语句是___B____.
28、若有以下说明语句:
C) language[2]元素的值,它是字符串PASCAL的首地址D)格式说明不正确,无法得到确定的输出
这段程序的输出是(C)
30、下面判断正确的是 C 。
33、设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下
不能正确执行的赋值语句是 B 。
41、以下正确的说明语句是 B 。
43、下面程序段的输出是 C
44、若要对a进行自增运算,则a应具有下面说明 D 。
45、若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j均在有效范围内)地址的表达式 A 。
46、下面程序的运行结果是 B
A)cc数组的两个元素中各自存放了字符串”1234”和”5678”的首地址
B)cc数组的两个元素分别存放的是含有4个字符的一维字符数组的首地
址 字符串保存在只读常量区
C)cc是指针变量,它指向含有两个数组元素的字符型一维数组