㈠ c語言數組指針
int (*p2)[5] = &temp;這是一個指針數組;第一個元素存儲的是數組temp的首地址;
*p2等價於&temp; **p2等價於temp數組的第一個元素的值1;
*(*p2+i);等價於*(&temp+i),等價於temp[i];
㈡ 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][]
(2)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語言數組指針
p2裡面放的都是指針,通過定義就可以看到,每個指針對應temp數組的一個元素。
所以*p2是一個地址,加一個數仍然是地址,然後用*取值
㈣ c語言中的數組指針
這時b代表數組第一個元素b[0][0]的地址,*b就是b[0][0]的值
1.
*b+1表示b[0][0]+1的值
2.
*(b+1)
首先地址b加一,此時就是b[0][1]的地址,故此表達式相當於*(&b[0][1]),也就是b[0][1]的值
3.
*(b+1)+1
由上面知此式表示b[0][1]的值加1
㈤ C語言數組指針
1數組指針強調是一個指針,這個指針指向的是一個數組,把數組名給這個指針就是對數組指針賦值了。
2二維數組里的每個元素是什麼要看你把這個二維數組定義成什麼類型,例如:char num[3][3],數組里每個元素是為char類型開辟的那麼大的一塊內存,可以存char類型數據。二維數組名是整個二維數組的首地址,a=&a[0]=&a[0][0]=a[0]值都是二維數組的首地址的值。
指針數組名是一塊開辟好的內存的首地址,是常量,比如a[0],指向數組的第一塊內存區域,那塊內存區域里是可以賦值的,明白了吧。
char *ss[6];ss[1]="right?"這句先定義一個char類型的指針數組,強調是一個數組,里邊的元素是指針,指針是指向char類型數據的,ss[1]是指針數組的第二個元素,是一個指針,指針的指向是「right」字元串的首地址。
char ss[6][20];ss[1]="right?"是定義一個二維字元數組,橫6縱20,起迷惑作用的!二維數組里ss[0], ss[1]等代表的是第一行,第二行的首地址,ss[0][3]是第一行第四個元素,ss[1][3]代表第二行第四個元素。
3第三個問題再用我講你就直接改行吧!!哈哈哈
祝你學習進步!!
㈥ C語言 指針數組的使用
int**a可以表達一個二維數組。為什麼呢?
你可以這么理解*p[3]表達的是一個數組指針,這個指針p[0]表示的是數組存的第一個地址。而數組實際上是一串連續地址的塊。每一個小塊存著一個內容。每次訪問數組時,你為什麼可以用數組名+下標訪問呢?//比如a[i];
實際上就是訪問*a+i;*這個符號可以表示你存的是變數的地址。而數組地址的第一位為int類型變數存的地址(你可以直接使用數組的地址加上單位變數的空間的大小去訪問下個元素)。在這個程序中int*p[3]表示可以存三個int類型的地址。而p正好把二維數組的三個一維數組的開頭的int類型變數的地址給存起來了。
給你舉個例子
實際上p[i]與 *(p+i)是表達的是同一個意思。只不過只有數組可以定義一個連續的空間
(數組的第一個地址是隨機的其他的是連續的。)單獨用指針的話會隨機分配的
數組的指針可以存三個地址。當然可以訪問二維數組了。
㈦ c語言怎麼將字元數組按兩個位元組存入指針數組
給你舉個例子,這里str就是一個二維數組,我手動輸入10個字元串存入該數組,然後用該二維數組的行指針輸出
#include<stdio.h>
#include<string.h>
void main()
{
char str[10][20];
int i;
for(i=0;i<10;i++)
gets(*(str+i));
for(i=0;i<10;i++)
puts(*(str+i));
}
㈧ C語言指針數組指針怎樣理解
指針數組,指數組元素就是指針
數組指針,對於一維數組來說就是數組名
故對於一維數組來說,數組名是第一個元素的指針,而元素本身也是指針,故數組名是指向指針的指針。
例如:int*p=&a;int**q=&p;
則p中儲存的是整形變數a的地址,而指針p自身也是變數(指針變數通常佔4個位元組),故q中儲存的就是變數p的地址。q就成了指向指針的指針。
㈨ 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語言數組指針問題
首先你要明白一點,數組名和指針本質上是一回事,都是地址,該數組的首地址。知道這一點後就可以活學活用了。這是c語言的精髓。
比如你定義了int
*p,a[10];並且讓p=a;,
這個操作叫做指針p指向了數組a,其本質是給p這個變數付了一個值,就是數組a的地址,也是a[0]的地址,也是a本身裡面存儲的內容。
那麼要引用a[i],你可以有很多種寫法,比如*(a+i),
*(p+i),
p[i],都是等效的。
p++的含義其實不是p=p+1,至少有時不是,p++的操作其實是讓p指向下一個元素,也就是原來p指向的是a[0],那麼現在p指向a[1]了。由於a是int類型,站4個位元組,那麼p++這個操作其實是讓p的內容增加了4。不要問為什麼,c語言就是這么規定的。如果p指向的是一個char類型,那麼p++就使p的值增加1。