1. 指標是什麼?
指標就是記憶體的位址,指標變數就是能夠儲存記憶體位址的變數。
一般資料型別變數名指的是這個資料所代表的值。
2. 如何定義指標?
在最開始宣告乙個指標變數的時候,為了表明是乙個指標變數,要在變數名前加「*」(間接引用符),在後續的使用中則不用加「*」了
下面兩種寫法是等價的
//乙個變數
inta;
//第一種,分開寫
int *t;
t=&a
//第二種
int *t=&a
前面的資料型別表明了指標指向的是什麼樣的資料型別
3. 具體用法
3.1:通過指標剪間接修改變數值
還是用上面的例子,下面兩種寫法是等價的
a=200;//直接修改
*t=200;//
間接修改
其實把*t看作a也行
3.2:指標的初始化
int *t=&a;//指標型別 *指標變數名 = &變數
//注意指標指向的資料型別要和指標型別一致
3.3:注意事項
指標資料只能使用四種值
1. 0值 常量 表示式
int a,b=0;int *t=a;//
錯,不能把整形資料賦給指標變數
int *t=b;//
錯,b是個變數
int *t=400;//
錯,非0
int *t=null;//
對,null可以看作0
int *t=0;//
對,是0,是個常量
2. 不能指向不同的資料型別
3. 直接將相同型別的指標互相賦值
4. 無效的指標型別
1. 0值指標
剛才說過0可以賦值給乙個指標變數,但這是無效的
2. 指標未初始化且未賦值時
這種指標很明顯是無效的
3. 指標指向的變數的記憶體空間已經被釋放了(迷途指標)
同上三種型別都是沒有指向乙個確定的物件,因此無效
5. 指標的運算
指標的運算一般只有在連續的儲存空間中才有意義(比如陣列)
(否則沒有指向乙個確定的物件,這個指標就是無效的啊)
int x[10],*p=&x[5];p+1
//指向x[5]的後乙個int變數
p-1//
指向x[5]的前乙個int變數
也可以加減乙個變數
int n=1
;p+n,p-n都是可以的
自加自減也可以
兩個指標可以相減(但是不能相加啊)
指標相減得到的值是這兩個指標之間所有物件的個數
也可以比較大小(比較兩個位址的大小關係)
6. const指標
第一種指標的定義:const 資料型別 *指標名
對於乙個常量,我們可以用乙個常量指標指向乙個常量
(用變數指標編譯都過不去)
相同的,乙個常量指標也可以指向乙個變數
但是,乙個變數指標不能指向乙個常量
乙個常量指標也就代表了無法通過指標間接修改它所指向的值
因此一般用於函式,確保在函式中引用的值不會被改變
第二種指標 資料型別 const *指標名
它表明了這個指標指向的物件是不會改變的
因此,試圖改變它指向的物件的操作都是非法的
但是要分開,這種指標可以間接改變它所指向的值
當使用帶有const的指標時其實有兩種意思。一種指的是你不能修改指標本身的內容,另一種指的是你不能修改指標指向的內容。聽起來有點混淆一會放個例子上來就明白了。
第三種指標 const 資料型別 const *指標名
以此類推,這種指標是一種指向的物件不能夠變化,也不能通過指標來修改物件的值的指標
2.4. 指標與一維陣列
乙個陣列由若干個元素組成,每個元素都有相應的位址,可以用指標來獲取每個元素的位址
c++中規定,陣列名既代表陣列本身,又代表整個陣列的位址(所以用scanf輸入字串時不需要加取位址符)
陣列名還是乙個常量,不能被改變(不能進行賦值,相加相減)
同時,陣列名還是陣列首元素的位址,因此下面兩個語句是等價的
int a[10];1. int *p=a;
2. int *p=&a[0];
如上,我們獲得乙個指向a陣列的指標p
這時我們有四種方法可以訪問陣列的值
1. a[i] //通過陣列下標訪問
2. p[i] //
通過指標下標訪問
3. *(a+i) //
通過位址引用訪問
4. *(p+i) //
通過引用指標訪問
(畢竟a也是乙個位址啊,和p裡存的是乙個東西,可以把p當a用)
2.5 指標與字串
c++允許定義乙個字元指標,在初始化時可以直接指向乙個字串常量,比如
1. char *p="c language
";2. char *p;
q="c language";
這時p儲存了這個字串的首位址,而不是整個字串,這時稱p指向字串
通過字元指標可以訪問字串,如
char str="c language
", *p=str;//
p指向字串
cout輸出c language(因為字串會一直輸出直到'\0')
cout<<&strl[7]取位址同理,輸出age
還可以通過字元指標遍歷字串
while (*p!='\0'
) cout
<<*p++; //
這時候*p不是位址,只會乙個字元乙個字元的輸出
2.5.1 指標陣列
定義:元素的資料型別時指標的陣列稱為指標陣列,例如
char *name=;
現在name就是乙個字元指標陣列
但是不同於一般陣列的是,指標陣列中儲存的是指標,例子中就有三個指標,分別指向不同的字串
之前說過陣列名也算是乙個指標,這裡name也是乙個指標,是 指向指標的指標,就是 二級指標
宣告乙個二級指標,和一級指標差不多,不過要用兩個星號,如下
char **pname;//指向上例中的name
pname=name;
//如果用二級指標去給一級指標賦值會報錯
現在pname指向name[0],pname[1]=name[1];
2.5.2 指向一維陣列的指標
也就是指向二維陣列行的指標變數,比如
//對於乙個二維陣列
int a[3][4
]=,,};
//可以用如下格式定義指向行的指標變數
int (*p)[4];//加了括號,後面跟著是陣列列的大小
//對這種指標賦值時只能賦行位址
p=a;p=&a[0];
//不能列位址,如
p=a[0],p=&a[0][0];
3.1 指標與函式
指標最重要的應用是作為函式引數,它能夠將更多的運算結果返回到主函式中
因此,指標是函式傳遞引數的重要工具
函式形參可以是指標型別,形參直接加個星號(int *p)就行
對於陣列(一維或多維)做函式形參,比如
//一維陣列為例
double **erage (double *a, int
n)//也可以寫double a
//呼叫時
double x[100
],f;
f = **erage (x,100
);//
陣列名做指標傳入函式中
草稿 未整理
async和defer 1 defer defer 和async true false html4.0中定義了defer html5.0中定義了async。1 沒有defer或async,瀏覽器會立即載入並執行指定的js指令碼,也就是說,不等待後續載入的文件元素,讀到js指令碼就載入並執行。2 有a...
C C 學習要點總結(未整理)
c c 學習要點總結 未整理 1.記憶體對齊問題 struct a sizeof a 16 2.continue語句的使用 3.拷貝建構函式的作用 4.多繼承且有內嵌物件時的建構函式 派生類名 派生類名 基類1形參,基類2形參,基類n形參,本類形參 基類名1 引數 基類名2 引數 基類名n 引數 物...
工作小記(未整理)
一 1.在瀏覽器頁面執行js,通過路徑找到其本地檔案,並進行修改的行為是否被允許,且瀏覽器不提示警告?2.改動js指令碼檔案,需要清理瀏覽器快取才能生效 3.插入clob欄位sql declare reallybigtextstring clob 待插入的海量字串 begin insert into...