到指標了呀,c語言的精華之所在。正確的使用指標,可以有效地表示複雜的資料結構、動態地分配記憶體、方便地使用字串、有效而方便地使用陣列及直接處理記憶體位址等。(辨別乙個人是新手還是老手的第二步就是看他能否靈活地使用指標) 指標
通過變數名a直接訪問變數名a內的資料。
2,間接訪問
將變數a的位址存放在另乙個變數b中,通過訪問變數b,間接達到訪問變數a的目的。
如何達到間接訪問呢,這裡就需要採用的指標了。變數b也就是所謂的指標變數,所謂的指標變數就是儲存其他變數位址的變數。
1, 指標變數的定義
型別*指標變數名
如int *a;
這裡的a就為指標變數了(非*a),在此之前我們需要了解兩個指標運算子。
( * ) :指標內容運數符
那麼我們在取乙個變數位址時,就可以用定義後的a=&b;
表示,想要表示b的值時,就可以用b=*a
表示(前面為直接訪問,後面為間接訪問)
注意:1,定義完指標變數後,應習慣性的使a=null
。null表示空指標。(指向空,是沒有分配空間的)
2,定義的型別後是指標變數名,並非表示式。
3,指標取位址不能跨界(這裡我將其描述為一維指標),即一維指標不能指向指標。
4,register定義的變數不能被取位址,因為其被定義於cpu內了,而非於記憶體內。
5,對a賦值,改變a的指向。對*a賦值,改變a所指向的值。
6,()
的優先順序大於*
。
沿用老師的話,指標第一定律2, 指標與函式p指向a,則*p就是a
變數的位址在呼叫函式時作為實參,被呼叫的函式使用指標變數作為形參接收傳遞的位址。(這種常會出一些坑人的題目)
如:
#include
point
(char
*p )
//自己先做一下,然後往右劃
main()
,*p=b;
//答案是a
point
( p )
;printf
("%c"
,*p )
;}
資料型別*函式名(引數列表)
這個在函式裡面曾提到過,不一樣的地方是這裡返回的是乙個該資料型別的指標,所以資料型別後加了乙個*號。
型別識別符號(*指標變數名)()
我現在覺得這個完全可以被函式返回指標替代,並沒有多大的使用價值。
3, 指標與陣列
在使用指標時,其中最好玩的就是它與陣列的結合了,用指標表示陣列是真的很方便喔。
1,p指向了a[0],那麼p+1就指向了a[1]。
2,*(p+1)=*(a+1)
p=&a[0]
3,指標變數加下標後即代表乙個數,如p[1]=a[1]
。
4,p是變數,a是常量。
沿用老師的話,指標第二定律
p[i]==*(p+i)==*(a+i)==a[i]
#include
intmain()
;char
*p=a;
while
(*p) p++
; printf (
"%d\n"
, p-a)
;}
減法運算最常用於計算乙個字串的串長,但我覺得挺雞助的,因為明明乙個strlen可以搞定的事嘛。
4, 字元指標
字元指標可以指向乙個字串,其存放的是乙個字串常量的首位址。這裡我們需要將其與字元陣列區分開。
字元指標 char *str="bad guy";
字元陣列 char string="bad guy";
注意:1,str是乙個變數,可以改變str的指向使它指向不同的字串,但不能改變str所指向的字串常量。(該字串於堆內)
2,string是乙個陣列,可以改變陣列中的每乙個變數。
5, 指標陣列
型別*陣列名[常量表示式]
int*p[5];
乙個陣列中的每個元素均為指標型別,即由指標變數構成的陣列,這種陣列稱之為指標陣列,即指標的集合。那麼這個陣列中的每乙個指標都可以指向乙個字元型資料(字串)。好多個字元指標呀。
指標陣列實用性最強的地方是作為main函式的引數出現,但老師並未在此作過多要求,我也不過多介紹了,感興趣的可以自行查閱。
6, 陣列指標(行指標)
型別(*陣列名)[常量表示式]
int(*p)[5];
我們知道普通指標指向乙個一維陣列後我們可以用p[i]表示a[i],這個用起來也非常的爽快。可遇到二維陣列後,我們再用普通指標的話,就無法用p[i][j]表示a[i][j]了,這便是跨界了。比較一下下面的兩個**。
main()
;int
*p;int i,j;
p=a;
for(i=
0;i<
6;i++
)printf
("%d",*
(p++))
;}
main()
;int
(*p)[3
];int i,j;
p=a;
for(i=
0;i<
2;i++
)for
(j=0
;j<
3;j++
)printf
("%d"
,p[i]
[j])
;}
我們可以發現針對二維陣列,我們想達到p[i][j]==a[i][j]的效果,普通指標已經不管用了,所以我們這裡就需要用到高階指標,其中之一即陣列指標。那為何又叫它行指標呢,因為它這裡的常量表示式的值需要和被指向的二維陣列的列值保持一致。
7, 指向指標的指標(第二個高階指標)
char**p
或char*p
(第二種常用於子函式的形參中)
既然是指向指標的指標,那麼我們就應該使它指向指標。那麼該如何使用呢,我們經常在函式中使用它。例如下面這個(對程式名排序後輸出)。
#include
#include
void
fun1
(char
*p,int a)
;main()
;int i,j;
fun1
(p,5);
for(i=
0;i<
5;i++
)printf
("%s\n"
,p[i]);
}void
fun1
(char
*p,int a)
//這裡的高階指標即指向了指標陣列p
}
而對於第乙個,我並沒有經常使用,因為對於普通變數,已經有普通指標了。對於二維陣列,可以使用陣列指標。對於函式,可以使用第二個。但它的用法可以舉例說明一下,如下面的輸出指標陣列。
#include
main()
;char
**p;
int i;
for(i=
0;i<
3;i++)}
其實可直接輸出printf
("%s\n",*
(a+i)
);完事。
越來越臨近了,下個星期三就要考c語言了,發完這篇後,我也需要將時間分配到其它科目了,但後續結構體等內容我還是會陸續整理的。在此也希望自己能考乙個好成績吧。覺得寫的還不錯的話,麻煩小手輕點乙個贊喔。 2017 09 11指標複習
1.指標 一段記憶體的位址 本質就是變數 資料 注意 空指標,野指標 2.指標的操作 取決於什麼型別的指標 3.指標訪問資料,訪問範圍 4.指標陣列,陣列指標 指標陣列 int p 陣列指標int p 5.常量指標,指標常量 const char p 常量指標 char const p 指標常量 6...
C語言整理 九 (指標)
記憶體是以位元組為單位的連續的儲存空間,每個記憶體單元都有乙個編號,稱為記憶體位址。指標就是在記憶體中存放的是別的地方的位址,通過訪問指標我們可以直接獲得儲存單元裡那個位址所儲存的內容。形式 資料型別 指標變數名 要注意的是指標的寬度,比如int就是4個位元組,float就是8個位元組。指標只是儲存...
8 指標小結
指標是資料在記憶體所佔儲存空間的首位址。存放指標值的變數稱為指標變數,當指標變數的值為某變數的位址時,稱這個指標指向該變數。同其他型別的變數一樣,指標變數也必須在使用前加以定義。指標變數的內容可以是0 null和乙個確定的記憶體位址。其中0和null等價,它們表示空指標。除0外,其他任何常量都不允許...