陣列可以賦值給指標嗎 (求高手)例如 int num

時間 2021-09-11 22:25:36

1樓:匿名使用者

可以。指標作為實體,是一個用來儲存一個記憶體地址的計算機語言中的變數。

陣列,是有序的元素序列。若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。

陣列名可以代表陣列的首地址,num就是num陣列的首地址,pn宣告為一個指標變數,它的值直接指向(points to)存在電腦儲存器中另一個地方的值,也就是個地址。因此num的值是可以賦值給pn的。

2樓:匿名使用者

指標與陣列是c語言中很重要的兩個概念,它們之間有著密切的關係,利用這種關係,可以增強處理陣列的靈活性,加快執行速度,本文著重討論指標與陣列之間的聯絡及在程式設計中的應用。

1.指標與陣列的關係

當一個指標變數被初始化成陣列名時,就說該指標變數指向了陣列。如:

char str[20], *ptr;

ptr=str;

ptr被置為陣列str的第一個元素的地址,因為陣列名就是該陣列的首地址,也是陣列第一個元素的地址。此時可以認為指標ptr就是陣列str(反之不成立),這樣原來對陣列的處理都可以用指標來實現。如對陣列元素的訪問,既可以用下標變數訪問,也可以用指標訪問。

2.指向陣列元素的指標

若有如下定義:

int a[10], *pa;

pa=a;

則p=&a[0]是將陣列第1個元素的地址賦給了指標變數p。

實際上,c語言中陣列名就是陣列的首地址,所以第一個元素的地址可以用兩種方法獲得:p=&a[0]或p=a。

這兩種方法在形式上相像,其區別在於:pa是指標變數,a是陣列名。值得注意的是:

pa是一個可以變化的指標變數,而a是一個常數。因為陣列一經被說明,陣列的地址也就是固定的,因此a是不能變化的,不允許使用a++、++a或語句a+=10,而pa++、++pa、pa+=10則是正確的。由此可見,此時指標與陣列融為一體。

3.指標與一維陣列

理解指標與一維陣列的關係,首先要了解在編譯系統中,一維陣列的儲存組織形式和對陣列元素的訪問方法。

一維陣列是一個線形表,它被存放在一片連續的記憶體單元中。c語言對陣列的訪問是通過陣列名(陣列的起始地址)加上相對於起始地址的相對量(由下標變數給出),得到要訪問的陣列元素的單元地址,然後再對計算出的單元地址的內容進行訪問。通常把資料型別所佔單元的位元組個數稱為擴大因子。

實際上編譯系統將陣列元素的形式a[i]轉換成*(a+i),然後才進行運算。對於一般陣列元素的形式:《陣列名》[《下標表示式》],編譯程式將其轉換成:

*(《陣列名》+《下標表示式》),其中下標表示式為:下標表示式*擴大因子。整個式子計算結果是一個記憶體地址,最後的結果為:

*《地址》=《地址所對應單元的地址的內容》。由此可見,c語言對陣列的處理,實際上是轉換成指標地址的運算。

陣列與指標暗中結合在一起。因此,任何能由下標完成的操作,都可以用指標來實現,一個不帶下標的陣列名就是一個指向該陣列的指標。

4.指標與多維陣列

用指標變數可以指向一維陣列,也可以指向多維陣列。但在概念上和使用上,多維陣列的指標比一維陣列的指標要複雜一些。

例如,在一個三維陣列中,引用元素c[i][j][k]的地址計算最終將換成:*(*(*(c+i)+j)+k)。瞭解了多維陣列的儲存形式和訪問多維陣列元素的內部轉換公式後,再看當一個指標變數指向多維陣列及其元素的情況。

1 指向陣列元素的指標變數

若有如下說明:

int a[3][4];

int *p;

p=a;

p是指向整型變數的指標;p=a使p指向整型二維陣列a的首地址。

*(*(p+1)+2)表示取a[1][2]的內容;*p表示取a[0][1]的內容,因為p是指向整型變數的指標;p++表示p的內容加1,即p中存放的地址增加一個整型量的位元組數2,從而使p指向下一個整型量a[0][1]。

2 指向由j個整陣列成的一維陣列的指標變數

當指標變數p不是指向整型變數,而是指向一個包含j個元素的一維陣列。如果p=a[0],則p++不是指向a[0][1],而是指向a[1]。這時p的增值以一維陣列的長度為單位。

5.指標與字元陣列

c語言中許多字串操作都是由指向字元陣列的指標及指標的運算來實現的。因為對於字串來說,一般都是嚴格的順序存取方式,使用指標可以打破這種存取方式,更為靈活地處理字串。

另外由於字串以′\0′作為結束符,而′\0′的ascii碼是0,它正好是c語言的邏輯假值,所以可以直接用它作為判斷字串結束的條件,而不需要用字串的長度來判斷。c語言中類似的字串處理函式都是用指標來完成,使程式執行速度更快、效率更高,而且更易於理解。

3樓:

可以,num為指向陣列第一個數值的指標,將其賦給同型別的指標pn,則pn也就指向陣列首位置,可以通過*(pn+i)來選擇輸出陣列內的資料!

4樓:匿名使用者

好問題,首先pn是一個int *型別的,預設可以轉換為指向int型別的

5樓:標準

似乎指標是指向陣列的第一個位置的???

想不起來啊。。。

6樓:匿名使用者

當然可以

這個指標指向的是陣列首地址

怎麼將一組陣列賦值給指標,比如, a[][3]={2,4,5,6,7,8,9,10,11} *p(3) 我要直接賦值的

7樓:匿名使用者

將陣列首地址直接賦值給指標即可。

8樓:匿名使用者

兩個問題:

1.輸入k之後 ,要重新將 p 指向 a 即10行前+一句 p = a;

2.最後一個for越界,i=9 時 p+i+1 就成了 p+10

9樓:貊虹

定義一個指標,指標指向你要的陣列就行了

10樓:華哥

#include

void main();

int *p[3];

*p=&a[0][0];

for(int i=1;i<9;i++)

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

printf("\n");}

11樓:驀然周接

首先要區別*p(3)與(*p)3,

12樓:黯梅幽聞花

指標變數可以指向一維陣列中的元素,也可以指向多維陣列中的元素。但在概念和使用上,多維陣列的指標比一維陣列的指標要複雜。

1、二維陣列的地址

二維陣列可以理解為一個廣義的一維陣列,一個以一維陣列為元素的一維陣列。例如定義一個陣列:

int a[3][4]=;

則陣列a對應的元素為:

a[0][0] a[0][1] a[0][2] a[0][3] …… 第0行

a[1][0] a[1][1] a[1][2] a[1][3] …… 第1行

a[2][0] a[2][1] a[2][2] a[2][3] …… 第2行

現在將第0行陣列元素a[0][0]、a[0][1]、a[0][2]、a[0][3]組成陣列a[0],第1行陣列元素a[1][0]、a[1][1]、a[1][2]、a[1][3]組成陣列a[1],第2行陣列元素組成陣列a[2],則a[0]、a[1]、a[2]就是一維陣列名,代表一個地址常量,分別指向每行的第0列元素,如圖 7 7和圖 7 8所示。那麼a[0]+1指向第0行的第1個元素,a[1]+1指向第1行的第1個元素,所以稱a[0]、a[1]、a[2]為列指標,對它們的增減1將移動1列元素。

圖 7 8 二維陣列中元素地址示意圖

對於二維陣列a來說,還可以把它看成是由a[0]、a[1]、a[2]這些「元素」組成的一維陣列,如圖 7 8所示。而a[0]、a[1]、a[2]又是由4個int型元素組成的陣列,所以a+0指向a[0]陣列的首地址(第0行元素的首地址),a+1指向a[1]陣列的首地址(第1行元素的首地址),那麼a+i指向第i行的首地址,所以a被看成是一個行指標,指標a的基型別是一個由4個int型資料構成的陣列。

由於a指向a[0],a+1指向a[1],所以*a等價於a[0],*(a+1)等價於a[1],*(a+i)等價於a[i],行指標*運算得到列指標。而a[0]+1指向第0行的第1個元素,a[1]+1指向第1行的第1個元素,那麼*(a[0]+1)等價於a[0][1],*(a[1]+1)等價於a[1][1],*(a[i]+j)等價於a[i][j],列指標*運算得到二維陣列的元素值。而a[i]又等價於*(a+i),所以*(a[i]+j)與*(*(a+i)+j)等價,都表示二維陣列元素a[i][j]。

對於二維陣列a[m][n]中的任意一個元素a[i][j],其地址可以表示為:

(1)&a[i][j],

(2)&a[0][0]+i*n+j,

(3)a[i]+j等價於*(a+i)+j

(4)a[0]+ i*n+j

對於二維陣列a[m][n]中的任意一個元素a[i][j],還可以表示成等形式。

【例7- 8】通過陣列元素的地址來引用二維陣列元素。

#include

#include

int main()

;cout<<"輸出二維陣列a:"<

int main()

;int (*p)[4]; //定義一個指向一維陣列(有4個整型元素)的指標變數

p=a;

cout<<"請給出輸出元素的下標值:"<>i;

cout<<"列標號:";

cin>>j;

cout<<"a["<

列標號:2

a[1][2]=7

怎麼將一組陣列賦值給指標,比如,a32,4,5,6,7,8,9,10,11p(3)我要直接賦值的

將陣列首地址直接賦值給指標即可。 兩個問題 1.輸入k之後 要重新將 p 指向 a 即10行前 一句 p a 2.最後一個for越界,i 9 時 p i 1 就成了 p 10 貊虹 定義一個指標,指標指向你要的陣列就行了 華哥 include void main int p 3 p a 0 0 fo...

二維陣列名為什麼不能直接賦值給二級指標。

二維陣列名相當於指標,但是它是一個指向陣列型別 也就是整型或者字元型,具體取決於你陣列的定義 而二級指標在真正意義上也是一個指標,但它是一個指向指標的指標。在定址時,拿整型陣列舉例,直接引用陣列名,系統會在陣列名指向的地址往後定址2個位元組得到一個整型數字。而引用二級指標時,系統會在指標指向的地址後...

普通的指標變數可以指向二維陣列嗎

麥香甜甜圈 當然可以。因為二維陣列在記憶體中也是按照一維方式存放的 記憶體單元是一維的 下面有個參考程式你可以試試。include void main int p a printf d n p 結果輸出1,將 p改寫成 p 1 則輸出2,改寫成 p 7 則輸出8,可見 p可以指向二維陣列中的任何一個...