C高階之指標(一)

2021-08-19 15:22:42 字數 1788 閱讀 5994

陣列指標與指標陣列

1.    陣列指標

下面部分程式的目的是想通過函式列印二維陣列元素,

#include

int array[3][4] = ,,};

int print_array(int **p, int m, int n)

inti, j;

for(i= 0; i < m; i++)

for(j = 0; j < n; j++)

printf("%d ",*(*(p+ i)+ j));

printf("\n");

return 0;

在main程式中這樣呼叫 printf_array函式

print_array(array, 3, 4)

函式在執行的時候出現如下錯誤:

segmentation fault (core dumped)

為什麼出現段錯誤呢?

因為在上面的程式中,p + i 代表指標偏移( i * 4)個位元組資料寬度,而array + i代表指標偏移i 行,每行4 * 4個位元組的資料寬度,也就是 i * 4 * 4個位元組資料寬度,所以並不能用 *(*(p+ i) + j)) 代表array[i][j]。

注:因為p是乙個二級指標是乙個指向資料型別為 指標 的指標,指標 寬度都是4個位元組,所以p + i代表偏移( i *4)個位元組資料寬度。

如果乙個函式的引數是乙個二維陣列,那如何傳參呢?這就需要用到陣列指標

在上面的程式中,p可以這樣定義

int (*p)[m];//這裡m為4,注意別丟掉括號,否則屬於另一種資料型別

這樣定義的p稱為陣列指標,它的本質是乙個指標,這個指標指向乙個二維陣列名代表的首位址,而且這個二維陣列具有的屬性是每行陣列有m個元素。為什麼需要這樣定義呢?因為只有這樣定義,編譯器才知道在編譯p + i時p指標每行要偏移多少個資料元素。

p = array;

p+ 0 代表 array[0]的位址

p+ 1 代表 array[1]的位址

p+ 2 代表 array[2]的位址

這樣 *(*(p+ i) + j)) 就等價於 array[i][j]

2.    指標陣列

在上面int (*p)[4];代表陣列指標,那p丟掉括號int *p[4];就代表指標陣列

為什麼p帶了括號就是陣列指標,丟掉括號就是指標陣列呢?

因為在 (*p)中,p先和*結合,所以p的本質就是乙個指標

在 *p 中,的優先順序高於*,所以p先和結合,所以p的本質就是乙個陣列

在指標陣列中,陣列中每個元素都是指標。

示例:#include

int main(int argc, const char *argv)

charstr1 = ;

charstr2 = ;

charstr3 = ;

charstr4 = ;

charstr5 = ;

charstr6 = ;

char*str[6] = ;

str[0]= str1;

str[1]= str2;

str[2]= str3;

str[3]= str4;

str[4]= str5;

str[5]= str6;

robot_say(str,6);

return0;

int robot_say(char *word, int n)

inti;

for(i= 0; i < n; i++)

printf("%s",word[i]);

printf("\n");

return0;

c高階之指標1

1指標 指標的實質就是個變數,它跟普通變數沒有任何區別,指標完整的名字是 指標變數。int a與int p 中a與p繫結的記憶體空間都是4個位元組 指標出現是為了間接訪問 cpu間接定址是cpu設計時決定的 p與 x列印指標,列印出的值是一樣的 下面四種在效果上是一樣的,編譯器不會報錯 int p1...

c高階之指標2

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

C 高階之指標算術

c 將陣列名視為陣列的第乙個元素的位址。如果兩個指標不是指向同乙個陣列,對兩個指標進行加減或者進行比較是沒有任何意義的。並且兩個指標指向同乙個陣列,兩個指標進行加減運算實際上是對陣列中的元素進行加減或者比較運算的,這樣得出的是沒有什麼實際意義的。加1的結果等於原來的位址上加上指向的物件占用的總位元組...