几个关于指针的疑问,还涉及结构体、数组


已知:int i,j=7,*p=&i;,则与i=j;等价的语句是
*p=j;

设有定义:struct {char name[12]; int a; double b;}t1,t2;,
且变量均已正确赋值,则以下语句中错误的是(  )
t2.name=t1.name;

下面程序的输出结果是( e )
#include<stdio.h>    
void main()
{    
char s[]="cent";
printf("%c\n",*s+2);
}  

img

第一题
&i是获取i变量的地址,p=&i是p指针指向i的地址,*p=j是对p指针指向的地址进行赋值, 因为p指向i的地址,所以i也被赋值了。
第二题
结构体t1和t2变量可以相互赋值的,但是结构体中的name是字符数组,也就等同字符指针,
对字符数组赋值是要改变数组的地址,但数组的地址不能改变, 所以t2.name=t1.name是错误的
对t2.name内容赋值应该用   strcpy(t2.name,t1.name); 
第三题
s[]是字符数组,也就等同字符指针,s是数组的首元素的地址, *s就是获取数组首元素的值'c',等同s[0],加2运算是对c的ASCII码值加2,结果就是'e'

第一题:p=&i,表明指针变量p对i取地址,也就是p中包含了i的地址,对p赋值,则对于p内地址所包含的内容就是被赋予的值,那么p中包含的i的值也就是赋予p得值。所以第一题用j给p赋值可以得到i也被赋值。
第二题:结构体定义的变量是可以相互赋值的,但是不能加减乘除运算,在这个题中,t1和t2他们代表的是当前结构体的名字,也就是表明这个结构体类型,不是产量,如果用这个结构体定义变量,那么他们之间就可以相互赋值。
第三题:定义的s[]可以理解为一个数组,也可以理解为一个指针,
s+2表示对s[0]解引用,就是获得他的值,也就是c,然后执行加2的运算,也就是c的ASCII码值加2,然后再进行类型转换,就是e

第二题,char name[12] 是字符串数组,字符串是不能直接赋值的,需用 strcpy()函数拷贝。