陣列與指標

2021-09-27 02:21:25 字數 4512 閱讀 9090

今天在資料結構課堂上老師有涉及到指標的一些運用,比如

int

function

(int

*a,int

*b)int

swap

(int

*a,int

*b)//交換函式

//與int

function

(int

&a,int

&b)

這兩個從實際上講是一樣的作用,但是更常用第二種吧,變數的表示更見的簡單。

然後呢,今天下午,就把二維陣列與指標複習一下吧。

首先呢,二維陣列表示

a [ i ] [ j ]是常用的一般表達形式,那麼指標的表示式應該是什麼?

元素可以表示為:*(a[ i ] + j ), * ( * ( a + i ) + j ), ( * (a + i ) ) [ j ];

然後呢,來講一下,

行指標的表示為如:a 表示乙個二維陣列的a [ 0 ] [ 0 ]位址,

a 和 a + i,都是表示為行的首位址,而且* ( a + i )也是表示第 i 行的位址,等價於 a [ i ],與 a + i 不同的是已經從行的控制轉到列的控制,因為元素的表示式為 * ( * ( a + i ) + j ); 而*(a+i)+j == &a[i][j]

那麼具體例項如下:

如:int a [ 0 ] [ j ] = 3, 那麼int (pa)[ 3 ] = a;其中 3 表示列數,之後, (*( p + i )+ j ) == a[ i ] [ j ];

pa 與 a 都是a[ 0 ]大元素的位址;

*pa與 *a都是a[ 0 ],是 a [ 0 ] [ 0 ]元素的位址;

pa + 1 與 a + 1都是a[ 1 ]大元素的位址;

*(pa + 1)與 *( a + 1)都是 a[ 1 ] ,是 a [ 1 ] [0 ]元素的位址。

其實,我們只要記住 * ( i )等價於 [ i ]即可。

強調一下指標加1,結果是對該指標增加1個儲存單位(即指標指向的資料型別所佔的記憶體的位元組數)。

#include

using namespace std;

intmain()

;int

*numptr=

(int*)

(&num+1)

;//此時所給位址應該是num[3]的指向位址

cout<<

"*(num+1) = "

<<

*(num+1)

<<

" *(numptr-2) = "

<<

*(numptr-1)

<

//*(numptr-1)指向num[1]

int *numptr=(int *)(&num+1);此時所給位址應該是num[3]的指向位址,即&num[ 3 ]; &num是陣列指標,其型別為 int (*)[3],num是長度為3的int陣列指標,所以要加3 *sizeof(int),所以numptr實際是num[3];但是numptr與(&num+1)型別是不一樣的,numprt-1只會減去sizeof(int),如:

#include

using namespace std;

intmain()

;int

*numptr=

(int*)

(&num+1)

;//此時所給位址應該是num[3]的指向

cout<<

"*(num+1) = "

<<

*(num+1)

<<

" *(numptr-1) = "

<<

*(numptr-1)

<

//*(numptr-1)指向num[1]

最後呢,對於記憶體而言,並不存在多維陣列,因為記憶體是一維的,記憶體裡面不分行也不分列,元素都是按順序乙個乙個往後排的,所以二維陣列中的每乙個元素在記憶體中的位址都是連續的。

比如對於二維陣列 a[m][n],如果將 &a[0][0] 賦給指標變數 p 的話,那麼 p 訪問二維陣列元素 a[i][j] 的公式就是:

p + i*n +j == &a[i][j];

結構體指標

我們使用時我有時候分不清,今天弄清這個測試記錄下來。

首先如下:

這個程式很簡單就是改值,不涉及位址改變;

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list head)

intmain()

改變形參,並改變值,發現不會對原指標發生改變,因為那是形參,也好理解。

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list head)

intmain()

此時,程式會出現錯誤,因為改變了head原指標指向,我們傳給被調函式的是原指標的位址,因此會改變原指標。

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list *head)

intmain()

下列程式也不會出錯,因為current只是指向head指標的位址,但是current = null的實際意義是將current自身位址改變為空了,並不是改變所指向位址為空,除非如上面所寫:*head = null;這樣將會出錯。

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list *head)

intmain()

下面這種情況,就是*head代表原指標位址,而head其實相當於另外乙個指標,只是將自身的位址賦值為空,而不影響原指標位址。

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list *head)

intmain()

下面這種情況就是temp和current都指向*head,改變指向指標的值,就會改變(*head)->num的值,所以改變current->num,temp->num也改變了。

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list *head)

intmain()

下面這種情況就不用多說了,直接在主函式就將剛申請的位址空間給賦空了,肯定有錯誤。

#include

using namespace std;

struct node

;typedef

struct node *list;

intmain()

這種情況按照上面說的,不會改變。

#include

using namespace std;

struct node

;typedef

struct node *list;

intmain()

和例8類似

#include

using namespace std;

struct node

;typedef

struct node *list;

void

f(list head)

intmain()

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...