學習記錄 指標(未整理)

2022-09-14 07:18:09 字數 3974 閱讀 9754

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...