C語言筆試例題_指針專練30題(附答案解析)
指針一直是C語言的靈魂所在,是掌握C語言的必經之路,收集30道C語言指針題目分享給大家,測試環境位64位ubuntu18.04環境,如有錯誤,懇請指出,文明討論!!!
文章目錄
- C語言筆試例題_指針專練30題(附答案解析)
- 1.筆試例題
- 2.結果與分析
- 總結
1.筆試例題
答案與解析在文末尾
1.char * p =“Hello”;是定義初始化指針變量,指針變量的值是一個字符串.說法是否正確
A :正確
B:不正確
2.以下代碼printf 輸出是什么?
void main (void)
{int a[]={4,5,6,7,8};int *p = a;*p++ += 100;printf(" %d %d \n" , *p,*(++p));
}
3.若定義:int a[2][3]={1,3,5,7,9,11},以下描述正確的是
A :*(a+1)為元素7的地址
B:(a[1]+1)的值是5
C:**(a +1)+2值是11
D:a[0]和a不同
4.以下代碼printf 輸出是什么?
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));return 0;
}
5.說出以下代碼的錯誤之處,并說明原因
char *getmemory( void )
{char p[] = "hello world";return p;
}void test( void )
{char *str = NULL;str = getmemory();printf( str );
}
6.在上下文及頭文件均正常的情況下,下列代碼的輸出是?(注:print已經聲明過)
main()
{ char str[] = "Geneius";print (str);
}
print(char *s)
{if(*s){print(++s);printf("%c", *s); }
}
A :suiene
B:neius
C:run-time error
D:suieneG
7.如下代碼是否存在風險,并說明原因和修改方式
#include <stdio.h>
int main () {//hello world 存放在常量區是不可以修改的char * str = "hello world"; *str = 'a'; // errorreturn 0;
}
8.如下代碼是否可行,說明原因
#include <stdio.h>
int main () {char str[4];str = "abc";return 0;
}
9.如下代碼輸出是什么
#include <stdio.h>
#include <string.h>int main(){char *str = "baidu.com";int i ;str = "hello world!";int len = strlen(str);printf("%d \n",len);printf("%c \n", *(str+4));printf("%s \n",(str+6));return 0;
}
10.以下程序的輸出結果(32位機器上)是()
int main(){char *p = "abcdefgh", *r;long *q;q = (long*)p;q++;r = (char*)q;printf("%s\n", r);
}
A :abcd
B:bcde
C:cdef
D:efgh
11.對于char * pa[7]的描述中,正確的是( )
A :pa是一個指向數組的指針,所指向的數組是7個char型元素
B:pa是一個指向某數組中第7個元素的指針,該元素是char型變量
C:pa[7]表示數組的第7個元素的值,是char型的值
D:pa是一個具有7個元素的指針數組,每個元素是一個char型指針
12.如下代碼輸出是什么
#include <stdio.h>
void fun(char **p) {int i;for (i = 0; i < 4; i++)printf("%s", p[i]);
}
main() {char *s[6] = {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"};fun(s);printf("\n");
}
A :ABCDEFGHIJKL
B:ABCD
C:AEIM
D:ABCDEFGHIJKLMNOP
13.test.c文件中包括如下語句,文件中定義的四個變量,哪個變量不是指針類型?
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a,b;
int_ptr c,d;
A :a
B:b
C:c
D:d
E:都是
F:都不是
14.有int s[2]={0,1}, * p=s; 則下列錯誤的C語句是 ()
A :s+=1;
B:p+=1;
C:*p++;
D:(*p)++;
15.請問下列代碼的輸出是多少()
#include <stdio.h>
int main() {int m[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int(*p)[4] = (int(*)[4])m;printf("%d", p[1][2]);return 0;
}
A :7
B:3
C:8
D:4
16.已知如下代碼
int a[] = {1, 2, 3, 4, 5};
int*p[] = {a, a + 1, a + 2, a + 3};
int **q = p;
表達式*(p[0]+1)+**(q+2)的值是____。
A :5
B:6
C:7
D:8
E:9
F:10
17.如下代碼輸出是什么
#include<stdio.h>
void foobar(int a, int *b, int **c)
{int *p = &a;*p = 101;*c = b;b = p;
}int main()
{int a = 1;int b = 2;int c = 3;int *p = &c;foobar(a, &b, &p);printf("a=%d, b=%d, c=%d, *p=%d\n", a, b, c, *p);return (0);
}
A :a=1, b=2, c=3, *p=2
B:a=101, b=2, c=3, *p=2
C:a=101, b=101, c=2, *p=3
D:a=1, b=101, c=2, *p=3
18.如下代碼輸出是什么
void GetMemory(char **p, int num)
{*p = (char *)malloc(num);
}
void Test(void)
{char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf("%s", str);
}
A :空
B:hello
C:出錯
19.如下代碼輸出是什么
int main(){int i = 10;int j = 1;const int *p1;//(1)int const *p2 = &i; //(2)p2 = &j;//(3)int *const p3 = &i;//(4)*p3 = 20;//(5)*p2 = 30;//(6)p3 = &j;//(7)
return 0;
}
A :1,2,3,4,5,6,7
B:1,3,5,6
C:6,7
D:3,5
20.在C++中,為了建立如圖所示的存儲結構(即每個結點含兩個域,data是數據域,next是指向結點的指針域),則在[] 處應填入選項是(多選題)
struct link
{
char data;
[];
} node;
A :link next;
B:struct link * next;
C:link * next;
D:struct link next;
21.有以下語句:(多選)
char str[4][12] = {"aaa", "bbbb", "ccccc", "dddddd"}, *strp[4];
for (int i = 0; i < 4; i++)strp[i] = str[i];
對字符串的正確引用是(),其中0≤k<4()
A :*strp
B:strp
C:str[k]
D:strp[k]
22.在64位系統下,分別定義如下兩個變量:char ? * ?p[10]; char( ? * ?p1)[10];請問,sizeof( p p p)和sizeof (p1)分別值為____。
A :4,40
B:80,8
C:10,10
D:8,80
23.若有以下說明和定義,在必要的賦值之后,對fun函數的正確調用語句是()
int fun (int *c){ … }
int main(){int (*a)(int*)=fun,*b(),w[10],c;…
}
A :a=a(w);
B:(*a)(&c);
C:b=*b(w);
D:fun(b);
24.下列程序的打印結果是?
char p1[15] = "abcd", *p2 = "ABCD", str[50] = "xyz";
strcpy(str + 2, strcat(p1 + 2, p2 + 1));
printf("%s", str);
A :xyabcAB
B:abcABz
C:ABabcz
D:xycdBCD
25.對于下面的語句
int c[4][5], (*p)[5];
p = c;
A :p + 1
B:*(p + 3)
C:*(p + 1) + 3
D:*(p[0] + 2)
26.對于以下代碼,char ? * ? p=new char[100];說法正確的是()
A :p和new出來的內存都在棧上
B:p和new出來的內存都在堆上
C:p在堆上,new出來的在棧上
D:p在棧上,new出來的在堆上
27.運行以下C語言代碼,輸出的結果是()
#include <stdio.h>
int main()
{char *str[3] ={"stra", "strb", "strc"};char *p =str[0];int i = 0;while(i < 3){printf("%s ",p++);i++;}return 0;
}
A :stra strb strc
B:s t r
C:stra tra ra
D:s s s
28.運行以下C語言代碼,輸出的結果是()
int main()
{char c, s[20];strcpy(s, "Hello,World");printf("s[]=%6.9s\n", s);return 0;
}
A :s[]=Hello,
B:s[]=Hello,World
C:s[]= Hello,
D:s[]=Hello,Wor
29.有以下語句定義,則能輸出a[1][2]的值的語句是()
int a[2][3];
int (*p)[3]=a;
int *q=*a;
A:cout<< ? * ?( ? * ?(a+1)+2)
B:cout<<p[1][2];
C:cout<<*(q+5);
D:cout<<q[1][2];
30.若有定義語句: int year=1009 , ? * ?p=&year ;以下不能使變量 year 中的值增至 1010 的語句是()
A:*p+=1;
B:(*p)++;
C:++(*p)
D:*p++
2.結果與分析
題目一:答案:錯誤 ,
原因:char * p =“Hello” 定義了一個指向字符串的指針變量 p,并將其初始化為字符串 “Hello” 的地址。所以指針變量的值為字符串的地址
題目二:答案:6,6:
原因:執行*p++ += 100語句之后,數組變成{104,5,6,7,8},p指針指向第個二元素:5,重點是考察的是變參函數printf,printf的參數入棧是從右到左執行的,所以先執行 ? * ?(++p)輸出6,再 執行 ? * ?p輸出6,輸出的是同一個元素。此題答案之前出現分歧,可能是運行環境不一致導致的。
題目三:答案:A:
原因:在二維數組中, ? * ?(a+1)表示第二列首元素地址,這里是7;(a[1]+1)表示第二列第二個元素的地址,這里應該是元素9的地址;**(a +1)表示第二列首元素求值,這里是7,+2得到的是9;a和a[0]其實是一樣的。一維數組和二維數組運算關系可參見博客:https://blog.csdn.net/Yin_w/article/details/131731082
題目四:答案:2,5:
原因:因為&a是整個數組a的地址,所以&a+1指向的是整個數組a后面的一個位置(跨越了整個數組),也就是ptr指向的是數組a之外的下一個位置。而由于數組a是連續存儲的,所以這個位置恰好是數組a最后一個元素的下一個位置。因此 ? * ?(ptr-1)的值就是數組a中最后一個元素的值,即5
題目五:答案:運行結果:運行無誤,但打印亂碼:
原因:getMemory(void)中的p[]為函數內的局部自動變量,在函數返回后,內存已經被釋放。如果一步步調試,會發現執行str=getMenory();后str不再是NULL了,但是str的內容并不是hello world,而是垃圾數據。
題目六:答案:A:
原因:主要考察遞歸思想,此題答案來自牛客網碼友,鳴謝!
題目七:答案:運行會報錯,:
原因:這種形式的字符串存儲在常量區。常量區 字符串只有讀取權限,沒有寫入權限,這就導致了字符數組 在定義后可讀取和修改每個字符而 第二種形式(字符串常量) 一旦定義后便不可修改,對它的賦值都是錯誤的(可整體賦值),這種形式可修改:
char str[] = “hello world”;
char *pstr = str;
*str = ‘a’;
題目八:答案:賦值方式錯誤:
原因:字符數組 只有在定義時才可一次性賦值,一旦定義完就只能一個個賦值。這樣寫正確:str[0] = ‘a’; str[1] = ‘b’; str[2] = ‘c’;與上述第七題的聯系和區別,可參見博客:https://blog.csdn.net/Yin_w/article/details/132426333
題目九:
答案:
12
o
world!
原因:字符數組是一個數組,關于指針和數組的規則同樣也適用于字符數組.故輸出字符串也可以用: ? * ?(pstr+i)、pstr[i]、*(str+i) 、str[i]進行輸出
題目十:答案:D:
原因:char* p = “abcdefgh”,每個字符占1個字節,那么總共是8個字節,此時p指向’a’。如果是p++,那么p將指向’b’。打印p會得到"bcdefgh"。 long* q = (long*)p 將p強制轉換為long*類型,也就是用long類型去解釋存儲了"abcdefgh"的這一段內存,此時q指向’a’,由于long類型是4個字節,那么q++移動4個字節,q將指向’e’,打印q將得到"efgh"。
題目十一:答案:D:
原因,這里定義的是一個指針數組,本質是一個數組,數組元素為指針
題目十二:答案:D:
原因:以上語句定義了一個指針數組 s。本質是一個數組,數組元素為字符串指針,而數組名是指向第一個元素的常量指針,因此 s 是指向指針的指針,所以函數 fun 的形參定義是 char **。fun(s) 將指針 s 的值傳遞給形參 p,所以 p = s,因此for(i=0;i<4;i + + )printf(“% s”,p[i]);中 printf(“% s”,p[i]) 等價于 printf(“% s”,s[i])。注意, s[i] 中存儲的不是字符串,而是字符類型的指針,但 printf 會輸出 s[i] 存儲的指針指向的字符串。所以最后輸出為 D。
題目十三:答案:B:
原因:typedef 給已有類型聲明一個別名,故c和d都是int_ptr類型也即都是int *類型;
#define宏定義,在預編譯時直接進行簡單替換,即原式變為:int ? * ? a,b; 這相當于是int *a, int b; 即a是指針,b是int型。參考博客:https://blog.csdn.net/Yin_w/article/details/134915018?spm=1001.2014.3001.5502
題目十四:答案:A
原因:數組名為指針常量,其值不可更改。
題目十五:答案:A
原因:int ? * ?p[n] 表示的是指針數組;int ( ? * ?p)[n] 表示的是一個指向有n個元素數組的指針;(int ( ? * ?)[4])m 表示以數組指針重新組織數組m,將其每4位劃為一組,這樣一來,m為{{1,2,3,4},{5,6,7,8},{9,0, , }},p指向第一行故p[1][2]即 ? * ?( ? * ?(p+1)+2),表示第二行第三個元素,為7
題目十六:答案:A
原因:a[]是一個有5個元素的數組, ? * ?p[]是一個指針數組,數組名p,其內部有4個元素,每個元素是一個指針,分別指向a,a+|,a十2,a十3。 ? * ?(p[0]+1)表示數組p的第0行第1個元素的值,即a[l],值為2。 ? * ? ? * ?q是一個二維指針,它是向p的首址,即p[0]+0,即a的首地址,a[0]。q+2表示指向&a的第2個元素,**表示取值3。所以答案5
題目十七:答案:A
原因:函數對a是值傳遞,所以int *p = &a得到的是形參的地址,不會改變a的實際值,“*p = 101”是把形參a的值變成了101;對**c,傳入的是二級指針,所以“ ? * ?c = b”改變了指針p的指向,現在p指針指向b,所以p取值是2,但c的值沒有變,依舊是3;對于b =p;相當于改變指針的指向,對于一級指針來講想在函數內部改變其指向是無效的,所以b的值其實也沒變,整個過程下來其實改變的只有p的指向,所以選A。可以參考博客:https://blog.csdn.net/Yin_w/article/details/132478099
題目十八:答案:B
原因:這里對傳入的參數是二級指針,但因為該函數形參p為實參的臨時拷貝,在函數內部申請空間的地址,存放在p中,不會影響str,所以當函數返回之后,str會成功指向開辟的堆空間,但一定要記得釋放,此題有區別于void GetMemory(char *p, int num)形式。
題目十九:答案:C
原因:
(1)const int ? * ?p1:不能通過指針p1修改指向的內存的值,但p1本身指向可修改。
(2)int const ? * ?p2=&i:與p1相同,即不能修改p2指向的內存單元的值,但是可以修改p2使其指向其它的內存單元。這里p2指向了整型變量i
(3)p2=&j:修改p2,使其指向整型變量 j ,由(2)可知(3)沒錯。
(4)int *constp3=&i:p3是指向整型變量的常指針,p3初始化后不能改變他的指向,但是可以修改p3指向的內存單元的值。
(5)*p3=20:通過p3將變量i的值修改為2,由(4)可知(5)沒錯。
(6)*p2=30:通過p2修改它所指向的內存單元的值,由(2)可知(6)錯誤。
(7)p3=&j:修改p3,使其指向j,由(4)可知(7)錯誤。
參考博客:https://blog.csdn.net/Yin_w/article/details/132394812
題目二十:答案:BC
原因:由鏈表的屬性可知,第二個成員是指向數據儲存數據的結構體類型的結構體指針,非常明顯BC均符合。
題目二十一:答案:ACD
原因:for循環實現將每個字符串的首地址賦給指針數組中每一個元素。strp為指針數組首地址,不是字符串的引用。str[k]為第k個字符串的地址,表示第k個字符串的引用。strp[k]表示指針數組的第k個元素,為第k個字符串的地址,也是這個字符串的引用。*strp取指針數組第一個元素,即為第一個字符數組的地址,也即為第一個字符串的引用。選擇A、C、D選項。
題目二十二:答案:B
原因:64位系統下一個指針占8字節。
(1)char ? * ?p[10]指針數組:array of pointers,即用于存儲指針的數組,也就是數組元素都是指針。如int* a[10]。
(2)char( ? * ?p1)[10]數組指針:a pointer to an array,即指向數組的指針。如int (*a)[10]。
sizeof( p p p)計算的是10個char型指針的數組大小,sizeof(p1)計算的是一個char型指針p1的大小,所以答案為80 , 8。
題目二十三:答案:B
原因:int fun (int *c){ … }定義了一個參數為int類型指針的函數。int ( ? * ?a)(int ? * ?)=fun的意思是定義了一個函數指針,該指針指向了fun函數,所以可以通過對指針取值調用該函數,且函數的參數必須是個地址,只有B符合,注意調用函數指針有ret = (*p)(); 和ret = p(); 兩種形式,參見博客:https://blog.csdn.net/Yin_w/article/details/129962775
題目二十四:答案:D
原因:本題考查數組和指針,在本題中c是二維數組,指針p指向二維數組c,p其實是指向c數組的第一行。因此選項A)中p+1指向c數組的第二行;選項B)中,p+3表示p指向c數組的第三行,因此 ? * ?(p+3)表示取出c數組第三行首元素的地址:選項C)和選項B)類似,表示取出數組c第二行首元素地址然后加3;選項D)中p[0]+2表示數組第一行第三列元素的地址,因此 ? * ?(p[0]+2)是取出該元素的值。 知識模塊:函數和數組
題目二十五:答案:D
原因:動態分配在堆中,其它的內存分配都在棧上進行。
題目二十六:答案:B
原因:p是char ? * ?類型,每次++,后移一位(char)
char ? * ?p=str[0]相當于char ? * ?p=“stra”,p先指向s,p++后,指向t,printf輸出遇到空字符停止
題目二十七:答案:C
由鏈表的屬性可知,第二個成員是指向數據儲存數據的結構體類型的結構體指針,非常明顯BC均符合。
題目二十八:答案:C
原因:%6.9s 表示顯示一個長度不小于6且不大于9的字符串。若大于9, 則第9個字符以后的內容將被刪除。%m.n表示場寬為m的浮點數, 其中小數位為n, 整數位為m-n-1,小數點占1位,不夠m位,左右對齊。
題目二十九:答案:ABC
原因:由鏈表的屬性可知,第二個成員是指向數據儲存數據的結構體類型的結構體指針,非常明顯BC均符合。
題目三十:答案:D
分析·: ? * ?p++是先取出 ? * ?p的值,然后讓p++ ,( ? * ?p)++是先取出*p的值,讓這個值++,*p+=1也是先取值再讓值++ 參考博客https://blog.csdn.net/Yin_w/article/details/132495312
總結
以上就是30道C語言指針測試題目,如有錯誤,懇請指出,收集不易,轉載留名,謝謝!!!