第7章 指针
- 格式:ppt
- 大小:2.80 MB
- 文档页数:55


C语⾔教材第七章指针实验第七章指针第⼀部分知识训练【知识要点】1. 地址与指针指针变量的概念:⽤⼀个变量专门来存放另⼀个变量的地址。
2. 指向变量的指针变量指针变量的形式:基类型 *指针变量名;&: 取地址运算符;*:指针运算符。
3. 指针与数组引⽤⼀个数组元素可以⽤下标法和指针法;可以⽤数组名作函数的参数。
4.指针与函数函数指针变量定义的⼀般形式为:类型说明符 (*指针变量名)();⼀个函数的返回值可以是⼀个函数。
【典型习题与解析】5. char * const p;char const * pconst char *p上述三个有什么区别?【解析】char * const p; //常量指针,p的值不可以修改;char const * p;//指向常量的指针,指向的常量值不可以改;const char *p; //和char const *p。
6. main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出结果是什么?【解析】答案:输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执⾏结果是2,5。
&a+1不是⾸地址+1,系统会认为加⼀个a数组的偏移,是偏移了⼀个数组的⼤⼩(本例是5个int)。
1)&a是数组指针,其类型为 int (*)[5];⽽指针加1要根据指针类型加上⼀定的值,不同类型的指针+1之后增加的⼤⼩不同。
2)a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],但是prt与(&a+1)类型是不⼀样的(这点很重要),所以prt-1只会减去sizeof(int*) a,&a的地址是⼀样的,但意思不⼀样。
3)a是数组⾸地址,也就是a[0]的地址,&a是对象(数组)⾸地址,a+1是数组下⼀元素的地址,即a[1],&a+1是下⼀个对象的地址,即a[5]。
习题7一 单选题1.设有如下定义,则表达式sizeof(y)的值是【 】。
struct data {long *ln; char c;struct data *last,*next; }y; A.7 B.9 C.13 D.17 【答案】C【解析】指针变量在内存中占用4个字节,所以sizeof(y)的值是4+1+4+4=13 2.设有以下程序段,则表达式的值不为100的是【 】。
struct st{int a;int *b;}; void main(){int m1[]={10,100},m2[]={100,200}; struct st *p,x[]={99,m1,100,m2}; p=x; ... }A.*(++p->b)B.(++p)->aC.++p->aD.(++p)->b 【答案】D【解析】根据题意,p 指向x 数组,x[0]的b 成员指向m1数组,x[1]的b 成员指向m2数组,如图7-1所示。
选项A 中p->b 指向m1[0],通过“++”运算p->b 指向m1[1],所以选项A 的表达式的值为100。
选项B 中++p 使p 指向x[1],x[1]的a 成员的值是100。
选项C 中p 指向x[0],x[0]的a 成员做“++”运算,结果为100。
选项D 中++p 使p 指向x[1],x[1]的b 成员的值是指针,所以选择选项D 。
m1m2p图7-13.设有以下定义,且如图7-2所示,指针head 和p 指向链表的第一个结点,指针q 指向新的结点,则不能把新结点插入在第一个结点之前的语句是【 】。
headpq图7-2struct node{int a;struct node *next;}*head,*p,*q;A.head=q,q->next=p;B.head=q,q->next=head;C.q->next=head,head=q;D.head=q,head->next=p;【答案】B4.设有如下结构体说明和变量定义,且如图7-3所示,指针p指向变量one,指针q指向变量two,则不能将结点two接到结点one之后的语句是【】。