指標,久違了!

2021-08-04 07:52:20 字數 3839 閱讀 4619

**:

一、基本知識點

int a=10;

int *p;//定義乙個int型別的指標

p=&a;//指標變數p指向了變數a

*p=20;//使用指標不通過變數直接修改變數a的值為20

*p表示訪問指標變數p指向的儲存空間

指標乙個作用:能夠根據乙個位址值,訪問(取值 | 賦值)對應的儲存空間

指標變數p前面的int,表示指標的型別

①. int *p;

②. *p=10;

兩個*的區別:前乙個起標識作用,表明定義的p是乙個指標,後者的*表示通過訪問p指向的位址空間

二、指標使用注意

①. int *p;

double d=10.0;

p=&d;//不建議此種做法

②. int *p;

p=200;//指標變數只能儲存位址

③. int *p;

printf(「%d\n」,*p);//指標變數未經初始化,不要拿來間接訪問其他的儲存空間

④. int *p=&a;但是不能寫成 int *p;*p=&a;這種寫法沒有任何的意義,可以認為*是和型別符一起使用的。

⑤. *是指標運算子,訪問指標指向的空間

三、指向指標的指標

int a=10;

int *p=&a;//指向int型的指標

int **p1=&p;//指向指標的指標

int ***p2=&p1;//**指標

*p2相當於訪問p1;

**p2相當於訪問p;

***p2相當於訪問a;

*p1相當於訪問p;

一顆星一條線。

四、指標練習

編寫乙個函式,計算a和b的和與差(乙個函式返回兩個值)

五、有關指標的疑問

注意:任何型別的指標都佔據8個位元組的儲存空間,那麼為什麼還要為指標加上型別呢?

對下面一段**進行記憶體分析,可以證明指標型別不正確帶來的嚴重後果。

int i=2;

char c=1;

int *p=&c;//本應該是char型別的,寫成了int型別

printf(「c的值是%d\n」,*p);//列印結果為513,而非1

printf(「c的值是%d\n」,c);//值為1

下面是上述**的結果的記憶體分析:

指標p訪問的本應該是1個位元組空間的資料,此時因為指標的型別是int型的,因此程式自然的從指向的位址0x0a開始讀取了4個位元組的資料,訪問的資料從1變成了513。

六、指標和陣列

int ages[5]=;

遍歷陣列

for(int i=0;i<5;i++)

printf(「%d\n」,ages[i]);

使用指標遍歷陣列

int *p;

p=ages;//也可以寫成p=&ages[0];,指標變數p指向了陣列的首元素

第乙個元素的位址p    &ages[0]

第二個元素的位址p+1    &ages[1]

第三個元素的位址p+2    &ages[2]

元素的值

*p        ages[0]

*(p+1) ages[1]

*(p+2) ages[2]

把指標當做陣列來用:

for(int i=0;i<5;i++)

printf(「%d\n」,*(p+i));

(1)陣列元素的三種訪問形式:

①. 陣列名[下標]

②. 指標變數名[下標]

③. *(p+1)

(2)指標變數的+1究竟是加多少?這取決於指標的型別,如果是char型別則加1個位元組,如果是int型別的,則加4個位元組。

(3)利用指標來接收乙個陣列,指標變數指向了陣列的首元素。

void change(int array)等價於void change(int *array)。

前者儲存的雖然是陣列元素的首位址,但是在傳遞時就已經變成指標了。

示例:void change(int *array)

int main() ;

change(ages); }

呼叫的結果為:陣列的第三個元素3

若改給change(&ages[2]);則呼叫的結果為5,因為此時array指向的是ages[2],把ages[2]當做了array的首元素

七、指標和字串

(一)基礎知識

下面兩行**有著本質的區別:

①. char name=「it」;

②. char *name2=「it」;//指標變數name2指向了字串的首字元i

char name[0]=『y』;//改變第乙個元素的值

printf(「%s\n」,name);//列印結果為yt

*name2=『y』;

printf(「%s\n」,name2);//此時程式崩潰

這是因為,兩者乙個是字串變數,乙個是字串常量。c語言的陣列元素存放於棧,裡面的元素可以隨便修改,稱為字串變數。而字串常量存放於常量區,會快取起來是不可更改的。

char *name1=「it」;

char *name2=「it」;

printf(「%p %p」,name1,name2);//位址是一樣的,說明name1和name2指向的是同乙個字串。

掌握字串定義的兩種方式:

①. 利用陣列

特點:字串裡邊的字元是可以修改的,適用於內容需要經常修改時。

②. 利用指標

特點:其實是乙個常量字串,裡面的字元不能修改,適用於字串的內容不需要修改,且這個字串經常被使用時。

(二)指標陣列

整型陣列:這個陣列中存放的都是整型陣列

指標陣列:這個陣列中存放的都是指標

int ages[5];

char *name[5]=;//字串陣列的常見寫法

對應於:

char name2[3][10]=;

儲存字串陣列的兩種方式:

①. 指標陣列(字串陣列)

②. 二維字元陣列(字串陣列)

如何輸入字串?(使用陣列——因其可變)

int main()

八、返回指標的函式

程式示例:

#include

char *test();

int main()

char *test() //返回指標的函式

九、指向函式的指標

陣列名即陣列的位址,函式名即函式的位址。

假設有函式:

void test ()

void (*p)();  //void指標變數指向的函式沒有返回值,()表示p指向的函式沒有形參

p=test; //有指標p,把指標p指向函式

有三種方式可以操縱函式:

①. 直接呼叫test();

②. 利用指標變數簡介呼叫  (*p)();

③. 簡化使用p()

練習:

假設有函式宣告為 int sum(int a,int b)

則相對應的指向該函式的指標應該定義為:int (*p)(int ,int);

把指標變數p指向函式:p=sum;

呼叫該函式的三種方式:

(1)int c=p(10,12);

(2)int c=sum(10,12);

(3)int c=(*p)(10,12);

假設函式宣告為:double haha(double a,char *b,int c);

則定義乙個指向haha函式的指標應該為:double (*p)(double,char *,int)=haha;

久違的簡訊

我不期待她給我回簡訊,因為好久了,好久沒有她回的簡訊了,更不用說她發給我的。她說,她總是不喜歡發簡訊的,以前她姐姐給她發n條簡訊她都不回,最後頂多給姐姐打乙個 權當補償。嗯,看樣子那陣子真是難為她了。可是現在,我甚至連一點點地補償都沒有。所以,還是大口的喝酒,把手機扔到了口袋裡。可是,真的好希望手機...

久違的充實

今天是周五,對於上班的人來說,明天週末了,今天都很有勁頭 對於高考完的娃來說,一直憧憬的象牙塔的生活似乎也不遠了,三個月的假期從今天開始。一切都好像充斥著假期的氣氛。而我,卻好像是故意跟自己過不去,在這個星期五,做了好多的事情。其實也不是好多,只是感覺自己學到了很多東西,很多知識,以至於我迎來了自己...

久違的情詩

風居住的街道 什麼時候開始,忘記了怎麼去寫詩。因為什麼時候開始,忘記了什麼是愛情。沒有離別,沒有傷心,沒有痛徹心扉的哭泣,沒有幾分感動的淚水濺灑這宣紙。我猶猶豫豫,我下不了筆。我已經心死了若干次,何來的激情與動力?啊 久違的情詩,伴隨著愛情的死亡,悄然埋葬在了我心裡。來 親愛的我問你,為什麼你會是我...