C語言利用面試真題理解指針的使用
前言
大家好~我又來了,今天給大家?guī)淼氖侵羔樀膸椎拦P試題,希望能夠加強大家對指針知識的把握,指針就應(yīng)該這樣學!
筆試題一
#include<stdio.h> int main() { int a[5] = { 1 , 2 , 3 , 4 , 5 }; int* ptr = (int*) (&a + 1); printf("%d, %d", *(a + 1), *(ptr - 1)); return 0; }
1.&a取出的是整個數(shù)組的地址,&a+1是跳過一個類型為int(* )[5]的數(shù)組。
2.a不是單獨放在sizeof內(nèi),并且數(shù)組名a前面沒有取地址符號,此時a表示首元素的地址。a+1時跳過一個類型為int的整型,即為第二位元素地址。
3.ptr-1是跳過一個類型為int的整型。
4.( * )(a+1)–>a[1];*(ptr-1)–>ptr[-1]。
筆試題二
#include<stdio.h> //結(jié)構(gòu)體大小是20個字節(jié) struct Test { int Num; char* pcName; short sDate; char cha[2]; short sBa[4]; }*p; //假設(shè)p 的值為0x100000。 如下表表達式的值分別為多少? //已知,結(jié)構(gòu)體Test類型的變量大小是20個字節(jié) //x86環(huán)境下 int main() { printf("%p\n", p + 0x1); //0x100000+20-->0x100014 //p+1表示跳過一個結(jié)構(gòu)體,一個結(jié)構(gòu)體的大小為20個字節(jié) printf("%p\n", (unsigned long) p + 0x1); //0x100000+1-->0x100001 //將p強制轉(zhuǎn)換成一個整型之后加1 printf("%p\n", (unsigned int*) p + 0x1); //0x100000+4-->0x100004 //p+1表示跳過一個類型為unsigned int的整型,即四個字節(jié) return 0; }
筆試題三
#include<stdio.h> int main() { int a[4] = { 1 , 2 , 3 , 4 }; int* ptr1 = (int*) (&a + 1); int* ptr2 = (int*) ((int) a + 1); printf("%x, %x", ptr1[-1], *ptr2); return 0; }
1.ptr[-1]相當于 * (ptr-1)
2.&a取出的是整個數(shù)組的地址,&a+1是跳過一個類型為int(*)[4]的數(shù)組。
3.a不是單獨放在sizeof內(nèi),并且數(shù)組名a前面沒有取地址符號,此時a表示首元素的地址。a進行了強制類型轉(zhuǎn)化成int,a+1進行整型之間相加,再進行強制轉(zhuǎn)化成指針,跳過了一個字節(jié),一個int類型大小為4個字節(jié),而數(shù)據(jù)進行的是小端存儲,故由指向01的指針,指向了00。而prt2的訪問權(quán)限是訪問4個字節(jié),故ptr2訪問的是0x02000000。
筆試題四
#include <stdio.h> int main () { int a [3] [2] = { (0 , 1) , (2 , 3) , (4 , 5) } ; int *p ; p = a [0] ; printf( "%d" , p [0] ) ; return 0 ; }
因為int a[3][2] = {(0,1),(2,3),(4,5)}是逗號表達式。
逗號表達式,就是用逗號隔開的多個表達式。
逗號表達式,從左向右依次執(zhí)行。整個表達式的結(jié)果是最后一個表達式的結(jié)果。
故int a[3][2] ={1,3,5};
a[0]是第一行的數(shù)組名,a[0]表示首元素的地址,即a[0][0]的地址,&a[0][0].
筆試題五
#include<stdio.h> int main() { int a[5][5]; int(*p)[4]; p = a; printf("%p,%d\n ", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0; }
1.p[4][2]相當于*(*(p+4)+2)。
2.兩指針相減,得到的是兩個指針之間的元素個數(shù)。
3.%p直接打印的是補碼,地址被認為是無符號整型。
筆試題六
#include<stdio.h> int main() { int aa[2][5] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; int* ptr1 = (int*) (&aa + 1); int* ptr2 = (int*) (*(aa + 1)); printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1)); return 0; }
1.* (aa+1)相當于aa[1],表示第二行的數(shù)組名。
2.&aa取出的是整個數(shù)組的地址,&aa+1是跳過一個類型為int(*)[2][5]的數(shù)組。
3.aa不是單獨放在sizeof內(nèi),并且數(shù)組名aa前面沒有取地址符號,此時aa表示第一行的數(shù)組名,aa+1表示第二行的數(shù)組名。
筆試題七
#include<stdio.h> int main() { char* a[] = { "work" , "at" , "alibaba" }; char** pa = a; pa++; printf("%s\n", *pa); return 0; }
pa++是跳過一個類型為char*的指針。
筆試題八
#include<stdio.h> int main() { char* c[] = { "ENTER" , "NEW" , "POINT" , "FIRST" }; char** cp[] = { c + 3 , c + 2 , c + 1 , c }; char*** cpp = cp; printf("%s\n", **++cpp); printf("%s\n", *--*++cpp + 3); printf("%s\n", *cpp[-2] + 3); printf("%s\n", cpp[-1][-1] + 1); return 0; }
1.*cpp[-2]相當于 * ( * (cpp-2))。
2.cpp[-1][-1]相當于 * ( * (cpp-1)-1)
到此這篇關(guān)于C語言利用面試真題理解指針的使用的文章就介紹到這了,更多相關(guān)C語言指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)基于靜態(tài)數(shù)組的順序表
這篇文章主要介紹了C++實現(xiàn)基于靜態(tài)數(shù)組的順序表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05C語言 動態(tài)內(nèi)存開辟常見問題解決與分析流程
動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存2022-03-03