陣列 指標陣列與陣列指標

2021-07-15 04:55:36 字數 3764 閱讀 5968

一、陣列型別

int a[10];

printf("a : %d, a + 1 : %d\n", a, a + 1);

printf("&a : %d, &a + 1 : %d\n", &a, &a + 1);

輸出結果:

(2)陣列元素的首位址是常量,不能修改,這是為了釋放記憶體空間所必需的,否則找不到釋放記憶體空間的首位址了

(3)定義乙個陣列型別

定義陣列型別的格式如下:

typedef

int(array)[5];

其中array便是這個陣列型別的名字。

舉個例子:

#define _crt_secure_no_warnings

#include

#include

#include

int main()

輸出結果:

二、指標陣列

1、指標陣列的定義

int

*a[5];

a就是乙個指標陣列

2、指標陣列的應用

(1)選單

#define _crt_secure_no_warnings

#include

#include

#include

//獲取選單中標題的位置下標

int getpos(char** mymenu, const char* key, int* pos)

*pos = 0;

for (int i = 0; mymenu[i] != null; i++)

}return ret;

}int main() ;

char key[64] = "do";

getpos(mymenu, key, &pos);

printf("pos : %d\n", pos);

for (int i = 0; mymenu[i] != null; i++)

system("pause");

return

0;}

mymenu是個指標陣列,傳給行參時,可以是char** mymenu,也可以是char* mymenu,指標陣列傳參時會退化成指標,這是c語言的強大,不需要知道這個陣列裡面究竟放了幾個元素,可以根據最後乙個元素為空,這就需要用到指標陣列的自我結束能力,或者傳給乙個陣列大小的引數。

這裡牽扯到指標陣列的自我結束能力,也就是說程式設計師在定義指標陣列的元素時,把最後乙個設為空,那麼編譯器就能知道到這裡就結束了。

比如:

char* mymenu1 = ;

char* mymenu2 = ;

char* mymenu3 = ;

這裡的三種結束方式都是可以的。

(2)命令列

int main(int argc, char* argv, char** env) 

printf("\n-----------------end argv-------------------\n");

printf("\n-----------------begin env-------------------\n");

for (int i = 0; env[i] != null; i++)

printf("\n-----------------end env-------------------\n");

system("pause");

return

0;}

輸出結果(這裡是用cmd執行的):

可以看到main函式的引數argv和env實際都是二級指標,argv寫成了指標陣列的形式而已。

再擴充套件一下main函式的記憶體分配,都知道main函式是程式的入口,那麼exe程式跑起來,也就是作業系統呼叫了main函式,那麼就有作業系統為main函式分配記憶體空間,調起來之後再把記憶體空間的首位址扔給main函式,讓main函式繼續執行記憶體的分配釋放等各種操作。比如上面選單的那個例子main函式呼叫了getpos函式,則由main函式為getpos分配記憶體空間,也就是說誰呼叫的誰就去分配記憶體空間。

所以說在企業的專案開發過程中,不管是使用的mfc框架,qt框架,還是linux核心,程式設計師只是使用各種api,往裡面填引數而已,實際都是框架裡把記憶體分配好了。

三、陣列指標

1、陣列指標的定義方式

(1)陣列型別定義

typedef int(arraytype) [5];

int a[3][5];

arraytype* myarray = &a;

(2)陣列指標型別

typedef int(*parraytype) [5];

int a[3][5];

parraytype parray = &a;

(3)直接定義

int a[3][5];

int (*parray)[5] = a;

2、多維陣列的本質

#define _crt_secure_no_warnings

#include

#include

#include

int print_array(int* array, int n, int

m) for (int i = 0; i < n * m; i++)

printf("\n");

return ret;

}int main()

}print_array((int

*)a, 3, 5);

system("pause");

return

0;}

輸出結果:

可以看到a是二維陣列的首元素位址,a + 1跳了乙個一位陣列的距離,也就是5 * 4 = 20個單位,跟陣列指標加1跳的步長是一樣的。&a是整個二維陣列的首位址,&a + 1跳了5 * 4 * 3 = 60個單位。

二維陣列賦給陣列指標後,可以通過陣列指標改變二維陣列的值,先看以前寫的一位陣列轉指標的過程:

a[i] ===》  a[0 + i] ===》  *(a + i)
那麼二維陣列轉陣列指標是乙個道理

a[i][j] ===》 a[0 + i][j] ===》 *(a + i)[j]  ===》  *(a + i)[0 + j]  ===》  *(*(a + i) + j)
3、多維陣列在記憶體中的儲存

雖然是多維陣列,但實際多維陣列在記憶體中還是按照線性儲存的,從上面的**中看出,在print_array函式中的第乙個形參是一級指標,利用這個一級指標仍然把二維陣列的值給列印出來了。

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...