怎麼更好的去理解陣列指標,關於指標陣列和陣列指標的,用法和區別

2023-01-05 21:26:04 字數 6488 閱讀 2589

1樓:大愛貓

一:陣列指標:陣列名本身就是一個指標,指向陣列的首地址。

注意這是宣告定長陣列時,其陣列名指向的陣列首地址是常量。而宣告陣列並使某個指標指向其值指向某個陣列的地址(不一定是首地址),指標取值可以改變。 二:

陣列指標:是指向陣列的一個指標,如int (*p)[10] 表示一個指向10個int元素的陣列的一個指標。 另外還有一個指標陣列 主要用來指向若干字串,使字串的處理更加靈活。

同時,我們應該清楚知道,字串本身就是一個一維陣列。 對於指標陣列應注意以下幾點: (1):

陣列中的元素均為指標型別資料 (2):在給陣列賦值時,表面看到是比如字串等,但實際陣列元素本身的值並不是字串,而是字串的首地址 eg. main() ; //這裡返回指標值的陣列name各元素的值並不是以上這些字串,而是這些字串的首地址 ......

} 這是兩則的區別。 指標陣列:指標的陣列,陣列的元素是指標; int *p[2]; 首先宣告瞭一個陣列,陣列的元素是int型的指標,這個陣列的元素是p[0], p[1]兩個整形指標 陣列指標:

指向陣列的指標。 int s[2], *p; p = s; 這個陣列的元素是2個整型數

2樓:2貨

陣列指標存的是陣列的首地址,也就是第一個變數的地址

陣列指標,指標陣列區別!要詳細,超詳細!我區分了好多次了,還是不清楚啊

3樓:匿名使用者

int a[3][4]這個無需多說,就是一個二維陣列。

int (*p)[4]就相當於int p[4],它就是一個二維陣列的指標,可以指向一個第二維度為4的二維陣列。而a就是這樣的陣列,因而下面是合法的。

p=a;

int *p[3]是指標陣列。說白了,就是定義了三個指標,分別為p[0],p[1],p[2]。可以將他們單獨拿來使用。

int a1,a2,a3;

p[0]=&a1;

p[1]=&a2;

p[2]=&a3;

4樓:草迎風

1、在c和c++中陣列的指標就是陣列的起始地址(也就第一個元素的地址),而且標準文件規定陣列名代表陣列的地址(這是地址數值層面的陣列表示)。

2、指標陣列是指一個陣列中的每個元素都是一個指標,也就是多維陣列。

說白了,陣列指標就是指指向陣列首地址的指標,也可以說是陣列的首地址。而指標陣列,按字面意思,指標的陣列,存放指標的陣列,也就是陣列中每一個元素都是指標,即多維陣列。

總而言之,陣列指標是指一個指標,而指標陣列是一個多維陣列。

例子:int a[3][4];int (*p)[4];int *p[3]

第一個,是指標陣列,a[3][4]可以看成是存放三個指標的陣列a[3],且每個指標指向一個存放4個整型資料的陣列。

第二個,int (*p)[4];這個和第一個例子的表達的意思一模一樣,我們可以這樣賦值:

int (*p)[4]=a;其中p表示指向存放4個整型資料陣列的指標,不過它沒有給出指標的具體定義,所以我們還可以用這樣賦值來理解:

若int b[n][4];(n為int資料)則int (*p)[4]=b;(p也是指向一個存放4個整型數的陣列,但這裡有n個p指標!)。

第三個,int *p[3];它定義了一組存放三個指標的整型陣列,我們可以近似地理解:

如int *q;(定義了一個q指標);

int *p[3];(定義了一組指標)。(這一組指標的定義等同於這樣三個指標的定義:int *x,*y,*z。)

5樓:匿名使用者

其實很簡單,不論是什麼指標,只要是型別匹配地址它就可以存放,因為指標就是地址!

int a[3][4] 這是一個普通的二維陣列

int (*p)[4] 這是一個指向有4個int型的一維陣列的指標,可以稱它為行指標(一行有4個int)

int *p[3]這是個有三個元素為指標的陣列

後面兩者都有指標,所以只要是地址,後面兩者都可接收,關鍵是在運算的時候你要弄清楚它具體是個什麼樣的指標,因為它們移動的位是不同的。普通指標一次移動一個元素,行指標一次移動一行。。。int a[3][4];int (*p)[4]=a;這樣把a的首地址給了行指標,p+i就是將p移到了a 的第 i行。

可以把*和&看成逆運算,行指標取*就成了列指標,也就是普通指標。*(p+i)就是一個位於a第i行首元素位置的普通指標,再移動j個位置取*就得到了a[i][j]的值即*(*(p+i)+j),用for迴圈可以輸出陣列。

如果用for(i=0;i<3;i++) p[i]=a[i];這樣三個普通指標分別指向了a的三行,可以用

for(i=0;i<3;i++)

for(j=0;j<3;j++)

printf("%d",*(*(p+i)+j));輸出a的所有元素。其中*(p+i)為p[i].

6樓:匿名使用者

int a[3][4]; 這個不用多說一個二維陣列。

int (*p)[4];這個是指向陣列的指標,就是說定義了一個 p 指標變數,它是指向int型陣列的。

可以讓p指向a, p=a;他就是一個指標變數。用法你還是自己試試才能明白。

int *p[3];這個肯定就是一個陣列了,就像int p[3],只不過他是int 指標型別了,

也就是說p[0],p[1],p[2] 只能放一個地址。

你在慢慢體會一下,明白就自己在程式設計試試就知道了。

7樓:白花戀歌

指標陣列,array of pointers

陣列指標 a pointer to array

看看英文名字就知道了,中文翻譯真的害死人。。。。

8樓:匿名使用者

陣列指標--指向陣列的指標,是一個指標,其指向的型別是陣列;指標陣列--元素為指標的陣列,是一個陣列,其中的元素為指標。

9樓:

這個不好描述,不過用od一看你就明白了,如 int a[3][4]; 就a在程式偏移地址0x000ef456:0x00,0x00,0x00,0x00,.

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

c語言中對陣列那麼指標的理解

10樓:太平洋的豬頭

你第一句話就錯了。*(a+i)表示的是在a+i那塊記憶體空間的值,而不是地址。

關於指標陣列和陣列指標的,用法和區別

11樓:

關於兩者怎麼用?有什麼區別?推薦看c專家程式設計。裡面有兩章對此描述的非常詳細。如果想弄明白,就要自己對懷疑的地方程式設計練習,很快就會弄懂。在這裡就不班門弄斧了。

關於接下來的兩個問題:

int (*p)[4]; 對於宣告,c專家程式設計也進行了詳細的介紹--可以參考。

上面的宣告是說: p是一個指標,指標指向一個陣列,陣列的大小為4,陣列元素的型別為int型。

int *s = ;

首先說一下int *s是什麼意思: s是一個陣列,陣列元素的型別為指標,指標指向一個int型的值。

你這樣給陣列初始化,單就這一表示式來看是不錯的。但是對於初始化的變數a, b, c, d, e你有沒有在初始化前定義,並且它們的型別應該是int型。

如下所示:

int a = 1, b = 2, c = 3, d = 4;

int * ptr_arr = ;

這樣就不會出錯了。

12樓:

指標陣列:array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標。

陣列指標:a pointer to an array,即指向陣列的指標。

還要注意的是他們用法的區別,下面舉例說明。

int* a[4] 指標陣列

表示:陣列a中的元素都為int型指標

元素表示:*a[i] *(a[i])是一樣的,因為優先順序高於*int (*a)[4] 陣列指標

表示:指向陣列a的指標

元素表示:(*a)[i]

13樓:

int (*p)[4]就是建立的名為「p」的一個 陣列指標(「陣列」是「指標」的定語,理解為「陣列型別的指標」,p指向的是一個 有四個int元素的陣列)

後面int *s... 就是宣告的一個 指標陣列(「指標」是「陣列」的定語,理解為「指標型別的陣列」,每一個元素都是指標)

出錯:我用vc 6.0跟devc++(內建gcc標準編譯器)都可以那樣的宣告的。

或者你可以把全部**(或上下文**)貼出來。

14樓:匿名使用者

int (*p); //陣列指標

int *s; //指標陣列

區分是哪種情況,可以根據*,(),〔〕的優先順序進行處理。

〔〕優先順序高於* 所以,*s這種情況下,s先是一個陣列,後才是指標,表示陣列的每個元素都是指標,所以叫指標陣列,又名 儲存指標的陣列。

()優先順序最高,高於,(*p)這種情況下,p先是一個指標,後指向一個陣列,此陣列沒有變數名,表示,指標指向了某個陣列,所以叫陣列指標,又名 指向陣列的指標。

int *s=;//可以這樣玩,前提是你要先定義int a,b,c,d,e;!

15樓:匿名使用者

指標陣列是一大堆指標放在一陣列內。每一個成員都可以指向一個變數。

陣列指標是一個指向陣列的指標。這個指標可以指向陣列裡的變數成員。用個迴圈體就可以了。

定義陣列指標:

int a[10];

int *p;

p=a;//把首地址賦給p。

定義指標陣列:

int *s=;//整型

char *s=;//字元。

int *s=;//首先是整型,但是變數不是整型。換成字元也不是字元。只是a,b等的地址。地址不能做變數吧?

希望幫到你。

c語言,指標與一維陣列的結合,最好按下面三種方法都編下,好讓我去理解

16樓:匿名使用者

// 下面的**用的的是方法1

#include

const int n = 20;

int isprime(int n)

void sort(int a, int n)if(i != k) }}

int main()

sort(b,n);

for(i = 0; i < n; ++i)printf("%d ",b[i]);

printf("\n");

return 0;}

指標函式 函式指標 指標陣列 陣列指標 函式指標陣列怎樣去理解

17樓:

指標函式——返回指標的函式;

函式指標——指向函式的指標;

指標陣列——每個元素都是指標的陣列;

陣列指標——指向陣列的指標;

函式指標陣列——每個元素都是指向函式的指標的陣列。

陣列指標和指標陣列怎樣理解,當他們作為函式引數時,怎樣呼叫的,求詳解,謝謝.

18樓:匿名使用者

這個問題很有趣,要理解有個前提,你至少要思考過陣列怎樣在記憶體中儲存,並且一個位元組一個位元組地畫過。

無論陣列指標,還是指標陣列,這樣的名詞性短語重心都在後面,所以陣列指標是個指標,指標陣列是個陣列。

陣列指標的例項:int(*p)[5]; 可以這樣解釋其定義:p是個指標,指向一個陣列,陣列有5個元素,每個元素是一個int型整數。

在記憶體中,p就是一個佔4位元組的變數,變數的值是個地址,在記憶體的那個地址處,有4*5=20個連續位元組被認為是一個int[5]陣列。做一次p++,p的值增加20。這種特性和二維陣列是有相似之處的,比如int k[3][5],事實上,可以這樣賦值:

p=k。 如果要在形參裡使用,可以將變數名去除,就抽象出資料型別。典型的函式宣告可以這樣寫:

void f( int(*)[5] ); 典型的實參呼叫可以這樣寫:f(k); 這裡的k是int k[3][5]二維陣列。我印象裡要把二維陣列名作實參使用,形參只能寫成陣列指標,形參直接寫成二維陣列是不行的,void f( int [3][5]);這樣宣告會報錯。

也不能寫void f( int** ); 因為int**和intint(*)[5]是不同的,前者做++只增4,後者增20。

指標陣列的例項:int*p[5]; 這樣解釋:p是個陣列,陣列有5個元素,每個元素是一個指標,指向一個int型整數。

這裡p是陣列名,是指標常量而不是變數,不可以對p賦值,這和上面比,是本質區別。從記憶體佔用情況來看,他和int p[5]沒啥區別,每個元素都佔4位元組。所以使用時可以參考整型陣列,只要把int替換成int*就行了。

比如宣告時可用void f( int*[5] );,也可用void f( int** );。呼叫實參時,就把實際的指標陣列名傳入即可,比如f(t);,這裡t是 int*t[5]。

這點篇幅其實是說不完的,書裡都用一整章來講呢。還是開頭說的,研究一下陣列及指標在記憶體裡怎樣儲存,一個位元組一個位元組畫一畫,有好處。

指標陣列函式的用法

應該這樣定義 const int temp int a,int b 但是函式不能返回一個陣列.這樣也編不過.請參考 include const int fun1 int a,int b const int fun2 int a,int b typedef const int fun int a,in...

求解陣列與指標的關係

這應該是一個求a b陣列裡面有幾個相同值的函式,條件應該是兩陣列都順序排序了,不然就有問題了。陣列和指標有一定的區別,不過一般情況下,它們是可以劃等號的,陣列變數如果不加下標的話,就是指向陣列記憶體第一個數的指標了,所以這樣將指標遞增,就可以做到遍歷陣列。記住指標就是地址,取星 p表示這個地址裡面放...

怎麼理解指向二維陣列的陣列指標是二級指標

一維陣列的名其實就是指標,如int a 4 a就相當於一個指標 int p a 沒錯 但是二維陣列 int aa 2 3 這個時候是不能用int pp aa 是錯誤的。實際上二維陣列的第一維是int ab 3 是個指標陣列,不是陣列指標。這個時候int ab 3 是與 int 不同的。所以接受二維陣...