目錄
指標和陣列
1. 陣列引數和指標引數
1.1. 一維陣列傳參
1.2. 一級指標傳參
1.3. 二維陣列引數和二級指標引數
2. 函式指標
2.1. 函式指標的定義
2.2. 函式指標的使用
2.3. (*(void (*)())0)() - 這是什么
2.4. 函式指標陣列
2.5. 函式指標陣列指標
本章節文章是作者通過觀看《C語言深度剖析》等各種資料總結的精華,基礎部分省略了不少,是為了讓大家能夠更加深入了解C語言的魅力!因為為了避免與之前的文章發生贅述,所以就直接講作者認為的精華部分哈!現在正文開始!
誰都不能阻擋你成為更優秀的人,
指標和陣列
1. 陣列引數和指標引數
1.1. 一維陣列傳參
陣列傳參是要發生降維的,因為如果要陣列再拷貝會浪費空間,所以就降維成指向其內部元素型別的指標,這樣傳參只需要開辟一個指標變數的大小,
#include <stdio.h>
#include <windows.h>
void show(int a[10])
{
printf("show: %d\n", sizeof(a));
}
int main()
{
int a[10];
printf("main: %d\n", sizeof(a));
show(a);//一定要傳陣列名,這才是首元素的地址,不需要&
system("pause");
return 0;
}
證明:

PS:注意傳入的形參中的p也是一個變數,所以需要臨時拷貝,形參實體化(就是有自己的記憶體空間),
1.2. 一級指標傳參
#include <stdio.h>
#include <windows.h>
void test(char *p)
{
printf("test: &p = %p\n", &p);
}
int main()
{
char *p = "hello world";
printf("main: &p = %p\n", &p);
test(p);
system("pause");
return 0;
}

結論:在C語言中,只要函式呼叫,必定發生拷貝,只不過要根據具體情況去決定,拷貝了什么,拷貝了多少!
這里問一個問題:函式呼叫,指標作為引數,要不要發生拷貝?答案是需要!因為指標變數,也是變數,在傳參上,它也必須符合變數的要求,進行臨時拷貝!
1.3. 二維陣列引數和二級指標引數
先說結論方便理解:1.所有的陣列都可以看做成一維陣列2.所有的陣列傳參,都要降維成指向其內部元素型別的指標,
例如:
2. 函式指標
2.1. 函式指標的定義
就是指向函式地址的變數稱為函式指標,
上面這個其實也是函式呼叫 

用一個(函式)指標變數去取函式的地址

2.2. 函式指標的使用
這里來一個小例子:


上面這張圖相當于給函式傳函式
下面是輸入輸出

2.3. (*(void (*)())0)() - 這是什么
0是一個地址,強制型別轉換為函式指標型別,然后解參考,再然后函式呼叫,
注意:這個0是在0號地址處,直接執行代碼,


這兩種寫法是等價的
PS:int*p=NULL;*p;取的是p的右值(*0),
2.4. 函式指標陣列
這就是一個函式指標,我們把(*p)去掉,就可以發現他是一個回傳型別為void 無引數的函式指標,

*的優先級小于[ ]所以這是一個陣列,然后把p[10]去掉,剩下的就是一個函式指標,所以這就是一個函式指標陣列,
2.5. 函式指標陣列指標

這就是一個函式指標陣列的指標,
今天的內容就到這里了哈!!!
要是認為作者有一點幫助你的話!
就來一個點贊加關注吧!!!當然訂閱是更是求之不得!
最后的最后謝謝大家的觀看!!!
你們的支持是作者寫作的最大動力!!!
下期見哈!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392182.html
標籤:其他
上一篇:匯編語言相關指令介紹(二)
