指標和陣列精析

2021-10-06 16:36:30 字數 1629 閱讀 3964

- 寫在前面

我們先舉乙個最簡單的例子

int i = 1;

我們知道它的意思, 定義了乙個整型變數 i ,它的值是1.

但是在編譯器或者computer的眼裡它是怎麼樣的呢?

編譯器先為變數i申請乙個位址,這個位址所存放的值是1.

也就是說如果要列印變數i的值是通過訪問位址的值來讀取變數i的值。

printf

("%p\n"

,&i)

;

printf

("%d"

,*ptd)

;

根本上來講,指標就是位址。

型別名 *p來表示

ps:下面的例子幫你更好地理解。

char s[5]

="love"

;char

*p;p = s;

這是字串s的存放值**,

乙個位址代表乙個位元組,乙個char型別字元所佔空間為乙個位元組。

字串型別最後一位c語言預設加乙個\0來結束

位址存放的值

10000

l10001

o10002

v10003

e10004

\0對於字串型別,指標解引用可以直接取得整個字串的值。(原理是指標指向字串首元素位址,c語言缺省會通過首位址依次往後遍歷直到』\0』結束)

**示意:

#include

intmain()

列印結果如下

這裡先帶你回顧乙個概念:

陣列名是陣列元素的首位址。

也就是說s與 &s[0]等價

具體後面討論陣列指標和指標陣列會用**詳解。

看到這裡你可能會有疑惑這裡為什麼不需要解引用。

就像上面寫的那樣,上述情況下,ptd實際上指向的是&s[0](s首元素的位址),c語言預設列印出字串格式的話會自動遍歷所有位址,可以理解為這種情況下ptd 和 s等價。

為了加深理解,你可以嘗試先將ptd改為*ptd. 再將 s改為 &s[0]、&s[1]試試看列印結果。

#include

intmain()

這樣的**是很危險的,因為我們不知道指標變數 i 到底指向**。這個道理就跟訪問未初始化的變數一樣,它的值是隨機的。

一般系統會直接報錯,但是當指標變數存放乙個合法的位址,那麼系統就排查不到。

具體原因可以思考左值,後面博文會寫到。

1.兩個值的交換 使用指標法

不用指標的方法 (如果你會自己寫函式的話不妨試試將交換的過程寫在乙個叫swap函式中,這裡先引入一下,後面傳值傳址會再講)

#include

intmain()

指標法

#include

intmain()

相信到這裡,指標概念用法你已經掌握

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...

指標陣列和陣列指標

該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...