可執行程式是由指令、資料和位址組成的。當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個位元組大小,沒錯 這就是指...