天天看點

C語言指針相關習題

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​