1.設有定義:int x=0,*p;
緊接着的指派語句正确的是(B)
A.*p=NULL;B.p=NULL; C.p=x; D.*p=x;
解析:題目中定義指針變量p,指針變量的指派隻能賦予位址,決不能賦予任何其它資料,否則将引起錯誤。不允許把一個數賦予指針變量,被指派的指針變量前不能再加”*說明符,是以B選項正确。
2.下列說法正确的是(C)
A)如果p是指針變量,則&p是不合法的表達式
B)如果p是指針變量,則p表示變量p的位址值
C)在對指針進行加、減算術運算時,數字1表示1個存儲單元的長度
D)如果p是指針變量,則*p+1和*(p+1)的效果是一樣的
【解析】B選項中,如果p是指針變量,則*p表示變量p所指向的位址的值;A選項中,如果p是指針變量,則&p表示變量p的位址;D選項中,如果p是指針變量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指針右移一位再取所指向變量的值。是以C選項正确。
3.設有如下的說明和定義
struct{
int a;char*s;
}x,*p=&x;x.a=4;x.s="hello";則以下叙述中正确的是(C)
A)(p++)->a與p++->a都是合文法的表達式,但二者不等價
B)語句++p->a:的效果是使p增1
C)語句++p->a;的效果是使成員a增1
D)語句*p->s++;等價于(p)->s++;
【解析】本題考查結構體變量的引用,++p->a的效果是使成員a增1,*p->s++為字元e,與(*p)->s++不等價。
因為取結構體成員操作符->的優先級大于指針運算符*,是以 *p->s就是*(p->s),s是char *,那麼*(char *)結果是一個char,也就是結構變量x的成員字元串s的第一個字元。 而(*p)->s是文法錯誤,p是一個指向結構x的指針,*p就是x,是一個結構型變量,不能用->操作符。是以p++->a不合法。
4.若有以下程式
#include<stdio.h>
int k=7,m=5;
void f(int **s) {
int *t=&k;
s=&t;
*s=&m;
printf("%d,%d,%d,",k,*t,**s);
}
main() {
int i=3,*p=&i,**r=&p;
f(r);
printf("%d%d%d\n",i,*p,**r);
}
則程式輸出的 結果是多少?
解析:首先我們來都f()函數裡面的代碼
int
*t=&k; t是一個變量,複制它的值是k的位址,*t就是k
s=&t; s是一個變量,它的值是t的位址,*s就是t
*s=&m; *s就是t,也就是把m的位址的值賦給t,那麼t的值就變成了m的位址
printf
(
"%d,%d,%d,"
,k,*t,**s);結果是7,5,5
再來看main()函數裡面的代碼
r的值傳遞給s,r和s是分别的2個變量,*r=*s=p,
但是f裡面重新修改了s,那麼變成了*s=t,沒有改動過p,是以r沒有變,p也沒有變。
printf("%d%d%d\n",i,*p,**r);
結果是3,3,3
【小結】
面對指針操作的時候,先撇開其度類型上的差別,比如問上邊的s和t,他們本質都是一個變量,然後答記錄了一個值,你隻需要記錄當s=&t時,*s就是t,然後一步步推理,就能分析清楚所有的指針操作,久而久之,熟能生巧。
至于類型上,記住一個關系:s=&t,那麼s就該比t多一個*号,如t是int
*t,那麼s就是
int
**s