//-------------------------------------------------------------------------------------------------
// 也可以写成这样
typedef struct people
{
char name[10];
int age;
float height;
double weight;
}SP;
12. 判别几个容易混淆语句的异同。异同都在我的脑海里,懒得打出来了,希望你自己想想,然后可以印在你脑海里。
break与continue
while,do……while与for
if……else if……else……与switch……case……default
define与typedef
13. int *p[4]与int (*p)[4]的异同。
l int *p[4]表示p是指针数组。由于[]比*优先级高,因此p先与[4]结合,形成p[4]形式,这显然是数组形式,它有4个元素。然后再与p前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。
l int (*p)[4]表示p是一个指针变量。它有4个元素,每个元素为整型。也就是p所指的对象是有4个整型元素的数组,即p是行指针。应该记住,此时p只能指向一个包含4个元素的一维数组,p的值就是该一维数组的首地址。p不能指向一维数组中的第j个元素。
14. *p++与*(++p),*(p++)与*(++p),还有 (*p)++
l *p++与*(++p)作用不同。前者是先取*p值,后使p的指针值加1。后者是先使p的指针值加1,再取*p值。
l 若p初值为a(即&a[0]),输出*(p++)时,得a[0]的值,而输出*(++p),则得到a[1]的值。
l (*p)++表示p所指向的元素值加1,即(a[0])++,如果a[0]=3,则(a[0])++的值为4。注意:是元素值加1,而不是指针值加1。
15. 若有定义int a[size][size];
l 请记住*(a+i)和a[i]是等价的。
l *(a[i]+j)、*(*(a+i)+j)都是二维数组元素a[i][j]的值。有人可能会问“a+1的值和a+1的地址怎么会是一样的呢”?其实,a+1是地址(指向第1行首地址),而*(a+1)并不是“a+1单元的内容(值)”,因为a+1并不是一个实际变量,也就谈不上它的内容。*(a+1)就是a[1],而a[1]是一维数组名,所以也是地址。以上各种形式都是地址计算的不同表示。
l a,a[0]的值虽然相同,但是由于指针的类型不同(a是指向一维数组,a[0]指向a[0][0]元素)因此,对这些指针进行加1的运算,得到的结果是不同的。 请记住,二维数组名(如a)是指向行的。因此a+1中的“1”代表一行中全部元素所占的字节数。一维数组名(如a[0],a[1])是指向列元素的。a[0]+1中的“1”代表一个元素所占的字节数。在行指针前面加一个*,就转换为列指针。例如,a和a+1是行指针,在它们前面加一个*就是*a和*(a+1) ,它们就成为列指针,分别指向a数组0行0列的元素和1行0列的元素 。反之,在列指针前面加&,就成为行指针。例如&a是指向0行0列元素的列指针。
例1:设有数据定义如下,则可以引用组中第i个元素(0<=i<=9)的表达式有(ABCD)
int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
A、a[i] B、*(a+i) C、p[i] D、*(p+i) E、*p+i
例2:若有以下的变量说明和语句,则在语句被执行后,*(*(pt+1)+2)表示的数组元素是__D__
int t[3][3],*pt[3],k;
for(k=0;k<3;k++)
pt[k]=&t[k][0];
A) t[2][0] B) t[2][2] C) t[2][1] D) t[1][2] |