高階指標2

2021-08-20 05:19:26 字數 2652 閱讀 7087

前面已經學習了關於指標與陣列的一些概念,現在我們繼續對它們進行了解,學習指標和陣列的定義與宣告,還有具體是怎麼傳參的呢?

【指標與陣列的定義,宣告】

通俗易懂的來說,定義是不存在的時候要它存在,而宣告是不知道的是讓它知道。

定義和宣告之間的差別就是 定義分配了記憶體而宣告沒有;定義只能出現一次,而宣告可以出現多次。

1.定義為陣列,宣告為指標

定義:

char arr = "abcdef";

宣告:

#include#includeextern char *arr;

int main()

定義為陣列,宣告為指標,程式執行起來就會發生中斷。這是因為,在宣告extern char *arr時,編譯器認為arr是乙個指標變數,在32位系統操作下佔4個位元組。這4個位元組儲存了乙個位址,這個位址上存的是char型別資料。在test.c檔案中定義了arr是乙個陣列,但是在main.c檔案中不知道。所以就會發生中斷。

訪問形式如下:

2.定義為指標,宣告為陣列

char *p = "abcdef";

#include#includeextern char p;

int main()

定義為指標,宣告為陣列,執行也有問題。在test.c中,編譯器分配4個byte空間,並命名為p。

同時p裡儲存了字串常量「abcdefg」的首字元的首位址。這個字串常量本身儲存在記憶體的靜態區,其內容不可更改。

在man.c中,編譯器認為p是乙個陣列,其大小為4個byte,陣列內儲存的是char型別的資料。

extern char p訪問時,是對p(指標裡的內容)進行訪問,所以結果是隨機值。

通過上面我們可以得出結論:定義為指標,只能宣告為指標;定義為陣列,也只能宣告為陣列。

【陣列傳參,指標傳參問題】

指標和陣列作為引數傳入函式時,傳入的是位址,即指向變數的位址和陣列的首位址,可以在函式中改變指標或陣列的值,但本質上它們還是值的傳遞(區別於變數的值傳遞的是:變數值傳遞不會改變實參原來的值。),我們無法對指標和陣列的位址進行操作(如:位址賦值,分配記憶體等),要進行位址操作需要使用指標引用或指標的指標。

1.一維陣列傳參:

一維陣列傳參時會發生降維問題,會降成指向其內部元素型別的指標。

char* test2(char *arr2)

//char* test2(char **arr2)

//int test1(int arr1,int size)

int test1(int *arr1, int size)

return arr1[4];

}int main()

; int size = sizeof(arr1) / sizeof(arr1[0]);

char *arr2[5] = ;

test1(arr1, size);//一維陣列,傳參時會降成指向int型別的一級指標

test2(arr2);//指標陣列,傳參時會降成指標陣列的指標

printf("%d\n", arr1[4]);//5

printf("%s ", arr2[1]);//abcd

system("pause");

return 0;

}

2.二維陣列傳參:二維陣列傳參時會降成一級指向其內部元素的指標。

//二維陣列傳參

//void test(int arr[5])

void test(int (*arr)[5])

int main()

; test(arr);

system("pause");

return 0;

}

arr[3][5]理解為乙個一維陣列a[3],其每個元素都是乙個含有5個char型別數的陣列.在傳參時,會降成一維陣列的指標(即陣列指標),注意:傳參後,除了首個能省略,其餘的括號絕對不能省略,這樣才能保證編譯器把arr解析為乙個指向包含4個char型別資料元素的陣列,即一維陣列a[3]的元素。

3.一級指標傳參:

//一級指標傳參

void fun(int *p,int size)

}int main()

; int *p = arr;

int size = sizeof(arr) / sizeof(arr[0]);

fun(p,size);

system("pause");

return 0;

}

函式引數部分是一級指標時,可以接受的引數例如:

fun(int*p):可以是乙個整形一級指標,可以是一維整型陣列陣列名

fun (char *p):可以是字元陣列

4.二級指標傳參:

void fun(int **ptr)

int main()

當函式引數部分是二級指標時,可以接受的引數例如: 

c高階之指標2

1指標與強制型別轉換 int char short 相容型 是同一類屬於整型,他們的儲存方式 即轉換成記憶體中的二進位制的方式 是相同的,只是記憶體格仔長度不一樣。float是一類 double是一類 a做左值存數進去時,是按照a的資料型別來儲存的,用printf 來讀取時是按照裡面的 d,f,c之...

指標高階詳解2

一.函式指標 首先看一段 include void test intmain 輸出的是兩個位址,這兩個位址是test函式的位址,那我們的函式位址想要儲存起來,怎麼儲存?首先,能夠儲存位址,就需要乙個指向函式的指標變數,即函式指標 void fun1 fun1先與指標結合,說明fun1是指標,指標指向...

指標與指標高階

指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向 points to 存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元。32位平台是4個位元組 64位平台是8個位...