c語言數組一維數組指針數組指針數組指針
⑴ c語言中,如何定義一個『指針數組』,這個『指針數組』專門用來存放『數組指針』。
指針數組定義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)[n];
()優先順序高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型數據的長度。
如要將二維數組賦給一指針,應這樣賦值:
int a[3][4];
int(*p)[4];//該語句是定義一個數組指針,指向含4個元素的一維數組。
p=a;//將該二維數組的首地址賦給p,也就是a[0]或&a[0][0]
p++;//該語句執行過後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]
(1)c語言數組一維數組指針數組指針數組指針擴展閱讀:
與數組指針關系
數組指針是指向數組首元素的地址的指針,其本質為指針(這個指針存放的是數組首地址的地址,相當於2級指針,這個指針不可移動);指針數組是數組元素為指針的數組,其本質為數組。
例如:*p[2]是指針數組,實質是一個數組,裡面的兩個元素都是指針,[]的優先順序比*的優先順序高,p先與[]結合,形成數組p[2],有兩個元素的數組,再與*結合,表示此數組是指針類型的,每個數組元素相當於一個指針變數
與二維數組對比
二維數組:如char string_1[10][10]只要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字元。我們可以通過指定下標對其元素進行修改。
指針數組:如char*str_B[5]系統至少會分配5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字元型數據的一個指針。
如果我做這樣的定義:
char a[3][8]={"gain","much","strong"};
char*n[3]={"gain","much","strong"};
他們在內存的存儲方式分別如右圖所示,可見,系統給數組a分配了
3×8的空間,而給n分配的空間則取決於具體字元串的長度。
此外,系統分配給a的空間是連續的,而給n分配的空間則不一定連續。
由此可見,相比於比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是訪問指針數組中的一個元素是用指針間接進行的,效率比下標方式要高。但是二維字元數組卻可以通過下標很方便的修改某一元素的值,而指針數組卻無法這么做。
舉例編輯
數組指針:
#include<stdio.h>
int main()
{
char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一個漢字=3個位元組
char(*p)[4];
int i;p=c;//將指針定位於c[0]
for(i=0;i<=5;i++)
{
printf("%s,",*(p+i));//或者將*(p+i)替換成*p++
}
printf(" ");
for(i=5;i>=0;i--)
{
printf("%s,",*(p+i));//或者將*(p+i)替換成*--p
}
return 0;
}
指針數組:
#include<stdio.h>
int main()
{
int i;
char*pch[6]={"妹","妹","你","坐","船","頭"};
for(i=0;i<6;i++){
printf("%s,",pch<i>);
}
printf(" ");
for(i=5;i>=0;i--){
printf("%s ",pch<i>);
}
return 0;
}
⑵ C語言 為什麼指向一維數組的指針是簡單變數指針而不是數組指針
指向一維數組的指針也「不是簡單變數指針而是數組指針」。你把一維數組首指針與指向一維數組的指針混淆了。操作一維數組就是操作一維數組的元素,而元素是挨個存放的,所以只需要其中一個元素(通常是下標為0的元素)的指針就可以通過加減一個常數或用下標操作所有元素了,所以操作一維數組的指針是指向元素的指針,不需要指向數組的指針。操作多維數組,比如二維數組,操作每個元素時使用的也是這一行的第一個元素的指針,與操作一維數組是一樣的;而操作二維數組的整行時才用得著「指向數組」的指針。所以二維數組的指針是二級指針,第一級是「數組指針」,管數組的行,第二級就是元素指針,管每行的元素。所以我們通常所說的一維數組的指針是不嚴謹的,其實是第一個元素的指針,叫數組「首指針」。
⑶ 請問C語言里一維數組能用數組指針嗎如果可以怎麼用呢
數組指針可以指向一維數組的。
指針本來就是變數,是用來存放地址的變數。
如:
int (*a)[3],b[12];
a=b;
a++;
之後,*a相當於a[3]
⑷ C語言中:數組指針與指針數組有什麼區別
數組指針是指向這個數組首地址的指針,指向對象是這個數組;
指針數組是存放一類指針的數組,這個數組的每個元素都是一個指針;
例子:
int a[10];
int* s;
s = a;//這里s就是一個數組指針,它的值就是數組a 的首地址;當然,如果a是一個整數,那s就是一個指向整型的指針;
int a;
int* s[5];
for(int i=0;i<5;i++)s[i]=a;
//這里s就是一個指針數組,它的每個元素都是整型變數a的地址
應該算比較明白了吧
謝樓上提醒
⑸ c語言中的指針數組和數組指針的區別
指針數組:數組里的每一個元素都是指針如*p[10],裡面的 p[0] 到 p[9] 都是指針;
可參考:http://ke..com/link?url=UejdrqVcDuHTMC_8__WmHL4YUfjTnWfEywIGgkJ_HR7qwIXy7DrOZKO_
數組指針:指向一個數組的指針,如 arr[10] 是一個數組, 讓一個指針指向這個數組 p = arr;
訪問時通過 *(p + n) 或 p[n] 訪問元素值,n為元素索引值;
可參考:http://ke..com/link?url=_
⑹ C語言指針數組、數組指針、函數指針、指針函數、字元串指針、
指針數組:
一個數組,其每個元素都是指針
數組指針:一個指針,指向一個數組(一般把數組首地址賦給指針)
函數指針:一個指針,指向一個函數(一般把函數棧的首地址賦給指針)
指針函數:
一個函數,
返回值類型為指針
字元串指針:一個指針,指向一個字元串(一般是把字元串的首地址賦給指針)
告訴你理解的方法:
短語名詞中
第二個名詞是主體,前面的是修飾的。
⑺ C語言中一維數組和指針有什麼區別
指針都沒初始化,運行個毛啊。
應該這樣:
⑻ C語言一維數組指針
p=&a;才是=號兩邊類型匹配。因為p被聲明為指向有4個元素的一維整型數組的指針,而a被定義為一個整型數組的第一個元素的指針,所以寫成p=a;等號兩邊類型不匹配,連編譯都過不了。而&a就是一個有4個整型元素的一維數組的指針——就是說在int a[4]={1,3,5,7};的定義後,a是1的地址,a+1就2的地址;而&a的值雖與a相同,但&a是整個數組{1,3,5,7}的地址,&a+1就指向7後面的那個單元了。而int (*p)[4];這種聲明恰好就是&a的意思,即p是個指針,指向一個4元素整型數組,也就是p+1就要跳過4個int元素所佔有的空間。
printf("%d ",(*p)[3]);中的(*p)[3]的意思是這樣的:有了p=&a;後,p的地址「值」就是1的地址「值」,但意思是緊挨著存放的1,3,5,7這4個int數的首地址,*p後就是第一個元素1的地址了,那麼(*p)[3]就向後移動3個元素位置,應該是7了……這里把*p用()括起來是因為[]的優先順序比*高,不括起來就被解釋成*(p[3])了,意思就大錯了!
這里涉及的指針操作表述起來有些「繞」,得慢慢體會……
⑼ C語言中:數組指針與指針數組有什麼區別
數組指針是指向這個數組首地址的指針,指向對象是這個數組;
指針數組是存放一類指針的數組,這個數組的每個元素都是一個指針;
例子:
int
a[10];
int*
s;
s
=
a;//這里s就是一個數組指針,它的值就是數組a
的首地址;當然,如果a是一個整數,那s就是一個指向整型的指針;
int
a;
int*
s[5];
for(int
i=0;i<5;i++)s[i]=a;
//這里s就是一個指針數組,它的每個元素都是整型變數a的地址
⑽ c語言一維數組與指針
由於你定義的int a[10],*p;a為數組,而你的p取的事數組a的首地址,此時p存放的地址就是數組a[0]所在內存中的地址,p+1則是數組中a[1]所在內存中的地址。p+x是這個一位數組中的元素所在的地址,此時p+x代表的就是a[x]的地址,*(p+x)就是取的p+x所指向地址中的值,所以說,*(p+x)就等同於a[1]。希望能解決您的問題