C語言題庫 指標

2021-08-08 17:29:08 字數 3253 閱讀 6404

1.請問下面的**定義了什麼

int (*(*funcs[4])(int (*)(int, int), int, int))(int, int);
分析:這是一行定義語句,c語言最難理解的便是其花樣繁多的宣告/定義。理解宣告/定義語句的關鍵是抓住一條: c語言像呼叫一樣宣告變數,從變數名(函式本身也是變數,代表一段「邏輯」記憶體)出發,看變數經過怎樣的操作(注意操作順序),最終得到什麼樣型別的值。

回答:1. 變數名funcs,可以進行 下標操作,說明funcs是乙個陣列;

2. funcs陣列的元素可以被*解析,說明陣列元素是指標,funcs是指標的構成的陣列;

3. 指標指向的物件,可以進行()呼叫操作,說明指向的物件是函式,funcs是函式指標的構成的陣列;

4. funcs陣列的元素指向的函式,有三個引數:int(*)(int,int)、int、int,第乙個引數是乙個函式指標,它的引數是兩個int變數,返回值是int型

5. funcs陣列的元素指向的函式的返回值可被*解析,說明返回值是個指標,這個指標解析後又可以進行()函式呼叫,說明仍然是個函式指標

6. 返回的函式指標指向的函式,引數是2個int變數,返回結果是int

定義了乙個有4個元素的陣列,陣列元素是函式指標,指向的函式以int(*)(int,int)、int、int為引數,返回是乙個函式指標。

返回的函式指標以int int為引數,返回值是int

2.a)char* (*fun1)(char* p1,char* p2);

b)char* *fun2(char* p1,char* p2);

c)char* fun3(char* p1,char* p2);

看看上面三個表示式分別是什麼意思?

c)這很容易,fun3是函式名,p1,p2是引數,其型別為char *型,函式的返回值為char *型別。

b) 也很簡單,與c)表示式相比,唯一不同的就是函式的返回值型別為char**,是個二級指標。

a) fun1是函式名嗎?回憶一下前面講解陣列指標時的情形。我們說陣列指標這麼定義或許更清晰:

int(*)[10] p;

再看看a)表示式與這裡何其相似!明白了吧。這裡fun1不是什麼函式名,而是乙個指標變數,它指向乙個函式。這個函式有兩個指標型別的引數,函式的返回值也是乙個指標。同樣,我們把這個表示式改寫一下:

char* (*)(char* p1,char* p2) fun1;

這樣子是不是好看一些呢?只可惜編譯器不這麼想。

3.解釋以下含義

int a

int *a

int **a

int a[10]

int *a[10]

int (*a)[10]

int (*a)

int (**a)

int **a[10]

int (*a)(int);

int (*a[10])(int):

a)int a;表示乙個記憶體空間,這個空間用來存放乙個整數(int);

b) int* a;表示乙個記憶體空間,這個空間用來存放乙個指標,這個指標指向乙個存放整數的空間,即a)中提到的空間;

c) int**a;表示乙個記憶體空間,這個空間用來存放乙個指標,這個指標指向乙個存放指標的空間,並且指向的這個空間中的指標,指向乙個整數。也簡單的說,指向了乙個b)中提到的空間;

d)int a[10];表示乙個陣列;

e)int *a[10] :陣列指標。陣列a裡存放的是10個int型指標;

先找到宣告符a,然後向右看,有說明a是個陣列,再向左看,是int *,說明陣列中的每個元素是int *。所以這是乙個存放int指標的陣列。

f) int (*a)[10] :a是指標,指向乙個陣列。此陣列有10個int型元素;

表示乙個記憶體空間,這個空間用來存放乙個指標,這個指標指向乙個長度為10、型別為int的陣列;和int**a的區別在於,++、+=1之後的結果不一樣,其他用法基本相同。

先找到宣告符a,被括號括著,先看括號內的(優先順序高),然後向右看,沒有,向左看,是*,說明a是個指標,什麼指標?在看括號外面的,先向右看,有 是個陣列,說明a是個指向陣列的指標,再向左看,是int,說明陣列的每個元素是int。所以,這是乙個指向存放int的陣列的指標。

g)int **a[10] 先向右邊看,a[10],陣列,每個放位址指向乙個位址,這個位址指向int資料

h)int (*a)(int);表示乙個記憶體空間,這個空間用來存放乙個指標,這個指標指向乙個函式,這個函式有乙個型別為int的引數,並且函式的返回型別也是int。

i)int (*a[10])(int):從a符號開始。其右邊是[10],說明a是個陣列,其中存了十個元素。再看a的左邊是乙個*。說明陣列中存的是指標。現在在看(*a[10])的右邊是(int);說明所存的指標是指向有乙個int形參的函式,現在看(*a[10])的左邊是個int ,說明指向的函式的返回值為int 型別

4.int *p和int (*p)的區別

前者是指標陣列,後者是指向陣列的指標。更詳細地說。

前: 指標陣列;是乙個元素全為指標的陣列.

後: 陣列指標;可以直接理解是指標,只是這個指標型別不是int也不是char而是 int [4]型別的陣列.(可以結合函式指標一併看看......)

int*p[4]p是乙個指標陣列,每乙個指向乙個int型的

int (*q)[4]q是乙個指標,指向int[4]的陣列。

定義涉及兩個運算子:「*」(間接引用)、「」(下標),「」的優先級別大於「*」的優先級別。

首先看int *p[4],「」的優先級別高,所以它首先是個大小為4的陣列,即p[4];剩下的「int *」作為補充說明,即說明該陣列的每乙個元素為指向乙個整型型別的指標。int *p[4]的儲存結構如下:(儲存方格橫向排列或豎向排列沒區別,只要按記憶體位址順序排列就行,此處只是為畫圖方便)

華電指標題庫

1.請用指標實現程式 n個人圍成一圈,順序排號。從第1個人開始報數 從1到3報數 凡報到3的人退出圈子,問最後留下來的是原來的第幾號的那位。include intmain i if i n i 0 while p 0 最後乙個有編號的就是留下來的 p printf 最後留下來的是第 d號 n p r...

C C 語言題庫

1.求輸出結果 int a 2 2 3 int ptr int a 1 printf d d int a 1 ptr 1 答案 7 12 1.a i a i sizeof a 2.a i a i sizeof a 0 int a 1 指向陣列 a 2 的第二個元素中的第乙個,也就是內部第二層大括號的...

領扣題庫 兩數之和 C語言)

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 遍歷陣列,我們要做的事情就是判斷陣列裡面任意組合的倆數相加之...