1樓:東哥shuo育兒
陣列名就是乙個指標常量,它代表陣列元素在記憶體相關資訊。
1、c語言
是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。
2、c語言的發明
20世紀60年代,美國at&t公司貝爾實驗室(at&t bell laboratory)的研究員ken thompson。
3、c語言標準
2023年12月8日,國際標準化組織(iso)和國際電工委員會(iec)再次發布了c語言的新標準,名叫iso/iec 9899:2011 - information technology -- programming languages -- c [9] ,簡稱c11標準,原名c1x。這是c語言的第三個官方標準,也是c語言的最新標準。
想向大家問乙個關於c語言的問題:行指標與二維陣列,行指標詩歌什麼概念呀?
2樓:地獄的冷槍
我們正常情bai況下例如 int a[10];int *p = a;
p指向的就是
dua陣列的首位址。
*p就是裡zhi面的第乙個元
dao素。
那麼專再到二維陣列。屬
指標p指向乙個二維陣列,那麼p就可以理解為指向二維陣列a的首位址。
你把二維陣列裡面的每一整行看做乙個元素,即把二維陣列按照一維陣列去理解,
則*p指向二維陣列的第一行。
則**p就指向第一行的第乙個元素。
c語言中二維陣列的指標如何表示
3樓:夜禮服假面
二維陣列和指標
⑴ 用指標表示二維陣列元素。
要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。
乙個二維陣列在計算機中儲存時,是按行儲存的,即先儲存第一行的元素,再儲存第二行的元素。
當把每一行看作乙個整體,即作為乙個大的陣列元素時,原來的二維陣列也就變成乙個一維陣列了。而每個大陣列元素對應原來二維陣列中的一行,稱為行陣列元素,顯然每個行陣列元素都是乙個一維陣列。
下面討論二維陣列元素和指標之間的對應關係,清楚了二者之間的關係,就能用指標處理二維陣列了。
設p是指向二維陣列a[m][n]的指標變數,若有:p=a[0]; 則p+j將指向a[0]陣列中的元素a[0][j]。
由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:p+i*n+j用"*"運算子表示為:*( p+i*n+j)同樣,a[i][j]也可使用指標下標法表示,如下:
p[i*n+j]
例如,有如下定義:
int a[3][4]=,,};
則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是乙個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:int *p=a[0];
則陣列a的元素a[1][2]對應的指標為:p+1*4+2
元素a[1][2]也就可以表示為:*( p+1*4+2)
用下標表示法,a[1][2]表示為:p[1*4+2]
特別說明:
對上述二維陣列a,雖然a[0]、a都是陣列首位址,但二者指向的物件不同。
a[0]是一維陣列的名字,它指向的是一維陣列a[0]的首元素a[0][0],對其進行「*」運算,得到的是一維陣列元素a[0][0]的值,即*a[0]與a[0][0]是同乙個值。
而a是乙個二維陣列的名字,它指向的是二維陣列a的首元素a[0],對a進行「*」運算,得到的是一維陣列a[0]的首位址,即*a與a[0]是同乙個值。它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。
當用int *p;定義指標p時,p的指向是乙個int型資料,而不是乙個位址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請務必注意。
示例:#include
int main()
,,};
int *p=a[0],max,i,j,row,col;
max=a[0][0];
row=col=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(*(p+i*4+j)>max)
printf("address of a is:%x\n", (unsigned int)a);
printf("address of a[0] is:%x\n", (unsigned int)a[0]);
printf("address of (a+1) is:%x\n", (unsigned int)(a+1));
printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1));
return 0;
}執行結果:
a[2][1]=88
address of a is:bfdc0368
address of a[0] is:bfdc0368
address of a[0][0] is:bfdc0368
address of (a+1) is:bfdc0378
address of (a[0]+1) is:bfdc036c
address of (a[0][0]+1) is:bfdc036c
從結果看出,a,a[0],a[0][0]是同乙個位址,
⑵ 用二維陣列名作位址表示陣列元素。
另外,由上述說明,還可以得到二維陣列元素的一種表示方法:
對於二維陣列a,其a[0]陣列由a指向,a[1]陣列則由a+1指向,a[2]陣列由a+2指向,以此類推。因此,*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價,┅,即對於a[i]陣列,由*(a+i)指向。由此,對於陣列元素a[i][j],用陣列名a的表示形式為:
*(*(a+i)+j)指向該元素的指標為:*(a+i)+j陣列名雖然是陣列的位址,但它和指向陣列的指標變數不完全相同。指標變數的值可以改變,即它可以隨時指向不同的陣列或同型別變數,而陣列名自它定義時起就確定下來,不能通過賦值的方式使該陣列名指向另外乙個陣列。
示例:求二維陣列元素的最大值。
該問題只需對陣列元素遍歷,即可求解。因此,可以通過順序移動陣列指標的方法實現。
main()
,,};
int *p,max;
for(p=a[0],max=*p;pmax)
max=*p;
printf("max=%d/n",max);
}執行結果:
max=88
這個程式的主要演算法都是在for語句中實現的:p是乙個int型指標變數;p=a[0]是置陣列的首元素位址為指標初值;max=*p將陣列的首元素值a[0][0]作為最大值初值;pmax)
}程式執行結果:
a[2][1]=88
⑶ 行陣列指標
對於指標,不管有多複雜,按照以下原則進行分析:
從變數名處起,根據運算子優先順序結合,一步一步分析。
在上面的說明中已經知道,二維陣列名是指向行的,它不能對如下說明的指標變數p直接賦值:
int a[3][4]=,,},*p;其原因就是p與a的物件性質不同,或者說二者不是同一級指標。c語言可以通過定義行陣列指標的方法,使得乙個指標變數與二維陣列名具有相同的性質。
行陣列指標的定義方法如下:
資料型別 (*指標變數名)[二維陣列列數];
例如,對上述a陣列,行陣列指標定義如下:
int (*p)[4];它表示,陣列*p有4個int型元素,分別為(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,亦即p指向的是有4個int型元素的一維陣列,即p為行指標。
(按照指標的分析原則進行分析:p先與*結合,說明p是乙個指標,然後與結合,說明指標指向的內容是含4個元素的陣列,然後與int結合,說明陣列中的元素為int型別。所以p是乙個指向含4個int型別元素的陣列的指標。
)此時,可用如下方式對指標p賦值:p=a;為做對比,比較一下如下指標:int *p[4];
(按照指標的分析原則進行分析:p先與結合,說明p是乙個陣列,然後與*結合,說明陣列的元素為指標,然後與int結合,說明指標指向的是int型別的變數。所以p是乙個含4個元素的指向int型別變數的指標組成的陣列。
)此外二維陣列不可以用int**型別直接賦值訪問
4樓:匿名使用者
小的示例程式:
#include
#include
using namespace std;
int a[3][4];
int main()
}這段示例程式在我本地上執行
的結果為:
&a[i][0] = 4214816
a + i = 4214816; *(a + i) = 4214816;
&a[i][0] = 4214832
a + i = 4214832; *(a + i) = 4214832;
&a[i][0] = 4214848
a + i = 4214848; *(a + i) = 4214848;
我想看到這個執行結果,你已經有所了解了,下面我再詳細說一下:
指標量a作為乙個二維陣列的指標量,其本質是乙個「指向指標的指標」(為了方便,下面稱其為雙重指標),或者你可以理解為a為int**型別的指標量。當a做加減運算時,得到的結果仍然是乙個「雙重指標」,即a + i是乙個雙重指標,它是乙個指向了原陣列第i行的起始位置的雙重指標。
而*(a + i)原來的雙重指標解引用後得到的乙個指標變數,他是乙個指向了原陣列第i行的起始位置的「單重指標」。
可以看出,a + i和*(a + i)儘管資料型別不同(前者為雙重指標,後者為單重指標),但是他們指向同一塊記憶體位址,因此作為指標量,他們的值是相等的。注意,僅僅是說,他們的值在數學上是相等的,並非說「他們是等價的」。
你的第二個問題亦是同理:
首先,作為c語言的操作符,本身即具有「解引用」的語義。明白的說,就是a[i]與*(a + i)是完全等價的,而&a[i]即等價於a + i。由於易知a + i和*(a + i)在數值上相當,那麼進行等價帶花可以知道,&a[i]和a[i]在數值上相等。
當然,此處仍非等價關係。
至於指向行的指標,所指的就是指向行首位置的指標量。
至於你的最後乙個問題,正如我剛才一直強調的那樣,等號兩端僅僅是數值上的相等,而非等價關係,因此無法按照你所設想的方式進行歸納推導。
另外,虛機團上產品**,超級便宜
C語言指標與二維陣列求解,c語言中二維陣列的指標如何表示
假設a是乙個二維陣列,則一 a是第乙個一維陣列名,陣列名 就是該陣列的 首位址!二 a 0 和 a都表示這個一維陣列第乙個元素的內容 這句話有問題,應該是 都表示這個 二維陣列 第乙個元素的內容!三 a和a好像不等價啊?關於陣列名和 陣列名書上有明確的介紹與說明 a a a 0 a 0 這是規定!細...
c語言中二維陣列名是不是可以看作指標陣列名
不可以,二維陣列要看做 陣列的陣列 以如下定義為例 int a 4 int p 給你個對於指標和陣列的正確理解吧 定義的不同 c 裡,指標和陣列是不同的型別,不要把陣列名看做 常指標 所以 sizeof a 和 sizeof p 值是不同的。操作 除宣告外,中括號操作符僅用於指標,如 p 0 p 5...
c語言 二維陣列指標中的和,C語言 二維陣列指標中的 和
要回答你的這個問題,不妨先根據你的問題先編寫一段小的示例程式 include include using namespace std int a 3 4 int main 這段示例程式在我本地上執行的結果為 a i 0 4214816 a i 4214816 a i 4214816 a i 0 42...