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 遍歷陣列,我們要做的事情就是判斷陣列裡面任意組合的倆數相加之...