C 指標的藝術

2021-09-24 13:24:57 字數 2711 閱讀 1305

可執行程式是由指令、資料和位址組成的。當cpu訪問記憶體單元時,必須把記憶體單元的位址載入到位址匯流排上,同時將記憶體電路的「讀寫控制」設定為有效,然後記憶體單元中的資料就通過資料匯流排流向了接受暫存器中,或者結果暫存器中的值流向目標記憶體單元中,這就是記憶體讀寫週期,而記憶體單元位址就是指標的值。

雖然型別名和*的組合是一種新的型別,但是編譯器解釋的時候會將*和後面的變數名結合

int

* a,b,c;

如果像這樣定義編譯器就會理解成:

int

*a,b,c;

a為int型別指標,b和c還是int型別的變數。

全域性指標變數的預設初始值是null,而non-static區域性指標必須顯示指定初始值;所以任何指標應在宣告的同時初始化它,要麼賦有效位址,要麼置空;

(1) 自增運算;表示指向下乙個元素;

(2) 自減運算;表示指向上乙個元素;

(3) 加整數i;表示向後遞進i個元素;

(4) 減整數i;表示向前遞進i個元素;

(5) 同型別指標相減;表示計算它們之間的元素個數;

(6) 指標賦值,把乙個指標值賦給另乙個指標

(7) 指標比較(> < == != >= <=)

(8) 取位址和反引用

上述3、4條中遞進i個元素其含義是:指標所指物件位元組數資訊

int arr[10]

=;printf

("%p\n"

, arr)

;// arr是首元素的位址

printf

("%p\n"

, arr+1)

;// 編譯器改寫成為arr+1*sizeof(int)

printf

("%p\n"

,&arr)

;// &arr是陣列的位址,雖然值和arr一樣但是表示的物件不同

printf

("%p\n"

,&arr+1)

;// 編譯器改寫成為&arr+1*sizeof(arr)

因此void*型別指標不能參與算術運算,只能賦值、比較、和sizeof()操作

&的運算元必須為乙個物件,不能對void*型別指標使用*取其所指向的變數

int a =0;

//int **p = &&a; 這樣是非法的

int*pint =

&a;int

**ppint =

&pint;

c/c++中預設char *表示字串:

char ch =

'a';

char

*pchar =

&ch;

cout << pchar << endl;

// 編譯器會錯把字元指標當作字串

cout <<

*pchar << endl;

// 正確用法:輸出乙個字元

在初始化字元陣列的時候可以這樣:

char message=

;char message2=

"hello"

;

儘管看上去第二種好像是乙個char*型別的字串常量指標,實際上並不是,它和第一種寫法是等價的。

也就是說當用於初始化乙個字元陣列時,它就是乙個初始化列表,在其他任何地方,它都表示乙個字串常量。

比如這樣:

char

*p =

"hello"

;const

char

*parr[3]

=;// 指標陣列,c++中必須加上const,c語言由於是弱型別,可以不加,但是最好加上,良好的程式設計習慣。

char arr[

6]=;

// 這裡是值拷貝,字元陣列,不需const

字串拷貝和比較

字串拷貝時需要用strcpy/strncpy,不要用=,因為那是字元指標的賦值。

同理 ==、 >=、 != 符號比較的時字元指標,如果想要比較字串是否相等需要用strcmp/strncmp

它是乙個指標,但它是指向陣列的指標

int

(*ptr1)[10

]=0;

int(

*ptr2)[10

]= ptr1 +1;

printf

("%d\n"

, ptr1)

;// 0

printf

("%d\n"

, ptr2)

;// 40

printf

("%d\n"

, ptr2-ptr1)

;// 1

陣列指標加減整數,加減的基本單位是整個陣列,如上述例子,ptr1為0,ptr2=ptr1+1,但是ptr2不為1,而是40,跳過整個含有10個int型別的陣列;但是ptr2-ptr1還是1,並不是40,這是因為基本單位是整個陣列(40個位元組的陣列),每40個位元組,對應1個單位,所以結果為1。

它是乙個陣列,但它的每乙個元素是指標(指標的陣列)

int a =0;

int b =0;

int c =0;

int*arr[3]

=;

arr[3]中的三個元素都是int*型別的,其中陣列名arr的值是乙個二級指標

C 中指標的使用藝術

在c 程式設計中使用指標能有速度快,節約記憶體等優點,是很多c 程式設計師的最愛。但指標是一把雙刃劍,用好了它,你就會發現指標有多麼的方便,反之,你可能就頭疼了,往往會出現意想不到的問題。一 什麼是指標 其實指標就像是其它變數一樣,所不同的是一般的變數包含的是實際的真實的資料,而指標只是乙個指示器,...

指標程式設計藝術

這段時間仔細看了看 蔡明志寫的 指標的程式設計藝術 對指標有更深的理解。對這段時間所看內容進行一下整理吧.1 指標主要用於變數 一維陣列 二維陣列以及結構體等 在c中要輸出位址則可以採用 int x 10 printf p n x 變數x 乙個指標指向乙個變數,則指標內容為變數的位址,而指標符號 可...

指標的程式設計藝術(二)

指標的程式設計藝術 二 之指標與字串 指標變數大小為4個位元組,看乙個例子 發現兩個資料的位址距離是8,正好是double型別資料的大小,位址的差距為指標變數所指向資料型別的大小 但是它不是指標型別變數的大小,其實看這個位址也可以發現它由8位十六進製制資料組成,正好需要4個位元組大小,沒錯 這就是指...