1樓:駒孤簡鵬濤
陣列指標(也稱行指標)
定義int
(*p)[n];
()優先順序高,首先說明p是一個指標,指向一個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
如要將二維陣列賦給一指標,應這樣賦值:
inta[3][4];
int(*p)[4];
//該語句是定義一個陣列指標,指向含4個元素的一維陣列。
p=a;
//將該二維陣列的首地址賦給p,也就是a[0]或&a[0][0]
p++;
//該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
指標陣列
定義int
*p[n];
優先順序高,先與p結合成為一個陣列,再由int*說明這是一個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下一個陣列元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...
p[n-1],而且它們分別是指標變數可以用來存放變數地址。但可以這樣
*p=a;
這裡*p表示指標陣列第一個元素的值,a的首地址的值。
如要將二維陣列賦給一指標陣列:
int*p[3];
inta[3][4];
p++;
//該語句表示p陣列指向下一個陣列元素。注:此陣列每一個元素都是一個指標
for(i=0;i<3;i++)
p[i]=a[i]
這裡int
*p[3]
表示一個一維陣列記憶體放著三個指標變數,分別是p[0]、p[1]、p[2]
所以要分別賦值。
這樣兩者的區別就豁然開朗了,陣列指標只是一個指標變數,似乎是c語言裡專門用來指向二維陣列的,它佔有記憶體中一個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,佔有多個指標的儲存空間。
還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。
比如要表示陣列中i行j列一個元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
優先順序:()>>*
2樓:暴君坎普
要搞明白陣列指標的含義 這裡*pt指向的是陣列首地址的地址, 這裡*pt==arr, pt==&arr,而對於陣列arr而言,arr就是陣列的首地址,即arr==&arr,所以*pt==pt.
3樓:匿名使用者
是一樣的,你定義的是一個指標陣列,pt就是一個二維陣列的指標,pt是第一行的行地址指向第一行的第一個元素,即元素1,而*pt是一個元素指標,指向的是第一行的第一個元素,也就是元素1
;你輸出他們的時候都是元素1的地址,所以是一樣的啊。
4樓:
*pt是 int *型別的變數,也就是說整形指標。
而pt是 int(*)[3]型別的,printf方法取的是指標的首地址開始到結束位置的內容。
所以無論你用pt 還是*pt都是一樣的。
但是實際上pt和*pt卻不是一樣兒的。
你可以隨便弄個指標,你在printf試試,輸出的肯定是指標所指資料的值,而不是指標本身的地址的值。
pt指向的是陣列的第一位,並且長度是陣列的長度x指標型別的長度,也就是說pt的內容是整個陣列。
*pt指向的是陣列中的第一個整數,其長度是一個整數的長度,也就是*pt的內容就只是第一個元素的值。
你自己可以debug一下就知道了。我剛試過。
5樓:mis_丫
看錯題目了,尷尬
對於陣列指標,pt其實就是arr的首地址,*pt也是arr的首地址,是一樣的
如果不是陣列指標,那是不一樣的。
你輸出的方式不對吧,*pt[0]這樣輸出
本來不想回那麼多,看到那麼多回答真是誤人子弟什麼指標陣列,整形指標都扯出來,
int(*pt)[3]這樣定義是陣列指標的定義!
這樣就說明了一個指向包含有3個元素的整形陣列的陣列指標就是說pt是一個指標,而它指向的物件是一個指標,這題裡面就相當於指標的指標
你說不一樣是因為你輸出方式錯誤
可以這樣輸出*pt[0],*(pt[0]+1),*(pt[0]+2)也可以用指標的指標輸出**pt,*(*pt+1),*(*pt+2)
6樓:跟我走_別後退
因為 arr == &arr
c語言 為什麼指向一維陣列的指標是簡單變數指標而不是陣列指標?
7樓:匿名使用者
指向一維陣列的指標可以是簡單指標也可以是陣列指標。
如,int arr[2]=;
//簡單指標
int *intp=arr;
//陣列指標
int (*arrp)[2]=&arr;
8樓:匿名使用者
首先我bai提一個觀點,數du組是陣列,指標是指標。兩者是zhi
不同的dao東西,希望你不要搞混。
簡單的版指標變數通常是指向權一個單一元素,指標變數中存放的是元素的地址,通過鑰匙*取出地址中的值。因為陣列是用一段連續的地址空間來儲存的,所以知道某一個元素加地址偏移量就能知道所有陣列的值。陣列指標是一個指標,指標指向一個陣列,偏移是按陣列來偏移的。
9樓:
指向一維陣列的
指標也「不是簡單變數指標而是陣列指標」。你把一維陣列首指標與
專指向一屬維陣列的指標混淆了。操作一維陣列就是操作一維陣列的元素,而元素是挨個存放的,所以只需要其中一個元素(通常是下標為0的元素)的指標就可以通過加減一個常數或用下標操作所有元素了,所以操作一維陣列的指標是指向元素的指標,不需要指向陣列的指標。操作多維陣列,比如二維陣列,操作每個元素時使用的也是這一行的第一個元素的指標,與操作一維陣列是一樣的;而操作二維陣列的整行時才用得著「指向陣列」的指標。
所以二維陣列的指標是二級指標,第一級是「陣列指標」,管陣列的行,第二級就是元素指標,管每行的元素。所以我們通常所說的一維陣列的指標是不嚴謹的,其實是第一個元素的指標,叫陣列「首指標」。
c語言中關於指向陣列的指標
10樓:
char str[100];
char *pi=str; //相當於char *pi ;pi=str;
char **ppi=*pi;//這個地方抄錯了。應為char **ppi=&pi;
定義加*表明這是指標型別的變數
用的時候,就是用的指標,加*幹什麼。
只有取指標所指變數的值,或給指標所指的變數賦值的等涉及指標所指的變數的時候,
才會又加*號,表示獲取或改變,指標所指變數的值。
char x=10;
*pi =x; //給指標所指的變數賦值,改變指標所指變數的值(改變*pi) 。
x=*pi; //取指標所指的值,取指標pi所指的變數的值(表示為*pi)賦值給x。
11樓:匿名使用者
pi ppi是指標 帶*是取值的意思
*pi=str 意思是把str這個陣列的首地址 放在pi所指的空間裡 換句話說就是pi指向了str陣列。用pi+1之類的就可以指向陣列裡面的東西 *(pi+1)等同於str[1]
12樓:匿名使用者
因為不管是str還是pi, ppi都指的是地址,函式呼叫時只需要知道引數的地址就行,然後再去取裡邊的值,而不用加上星號來傳遞裡邊的值。
13樓:匿名使用者
因為陣列的名字,本身就是指向陣列頭的指標。另外char **ppi=*pi;是不對的吧。這意思是給一個指標賦值一個常數,這樣的賦值只允許右值為0的
14樓:
你給的第三條語句語法是錯的,應該是char **ppi=π
15樓:連嘉悅牢義
首先要明白,指標陣列中儲存的是指標,也就是說兩個元素都是指標,而且存放的也的確是「a」和「a」的地址,但要知道字串和字元是兩個不同的資料型別,也就是說雖然存放的地址是一樣的,但指標的型別不能理解為是指向字元「a」和「a」的指標,應該是指向字串「abcd」和「abcd」的,明白的麼?
16樓:端麗芳表曄
要點:理解陣列名其實就是一把指標!它指向所有元素的第一個inta[10];
則它的記憶體分佈:a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
陣列名a
就是指向了第一個元素
a[0]
的地址(注意是地址)所以上面的也可表示為:
*(a+0)
*(a+1)
*(a+2)
*(a+3)
*(a+4)
*(a+5)
*(a+6)
*(a+7)
*(a+8)
*(a+9)這是一樣的!而如果定義一把指標並賦值:
int*p;p=
a;則p
現在和a都指向了第一個元素a[0]的地址,所以它的用法和a一樣如:*(p+0)=p[0]=a[0]=*(a+0)
,*(p+1)=p[1]=a[1]=*(a+1)……看領會下就懂了哦~~~
陣列名和指標的區別C語言中陣列名和指標的區別
可以!下面是我學習陣列和指標的總結 1 指向陣列首地址 對於一維陣列a 10 陣列的首地址為a 呼叫 p a a i 或者 p i 對於二維陣列a 3 4 整個陣列的首地址為a 0 呼叫 p a 0 a 0 i 或者 p i 此時a代表陣列第一行的地址。3 指向陣列的每行 形如 int a 3 4 ...
c語言中指標陣列和行指標的區別是什麼
int p 4 這個就是行指標 這種型別的指標p是指向一個一維陣列,這個一維陣列包含4個整形元素 但是 int a 4 p a 這種方式卻是不對的 因為p只能指向一個整型的一維陣列,不能指向一個整型資料,a所指向的正是a 0 是個整型數 實際上int p 4 這種型別的指標是用於多維陣列中的,比如定...
邏輯變數和邏輯函式的取值為什麼只有0和1兩種可能
因為邏輯判斷 只包含真 和 假 1代表真 0代表假 邏輯運算不同於一般的數 算 他指專門針對邏輯的真假 作出判斷 而不是像數 算那樣的 加減乘除等等 邏輯變數和邏輯函式的取值為什麼只有0和1兩種可能 因為邏輯判斷只包含真和假 1代表真 0代表假 邏輯運算和一般的數 算不同,他只專門針對邏輯的真假作出...