c語言指標
前導程式
1 #include2一、基本知識點3 4 5 void change(int *);
6 7 int main()
8 9
20 21
22 23 void change(int *n)
24 25
30 31
int a=10;
int *p;//定義乙個int型別的指標
p=&a;//指標變數p指向了變數a
*p=20;//使用指標不通過變數直接修改變數a的值為20
*p表示訪問指標變數p指向的儲存空間
指標變數p前面的int,表示指標的型別
①. int *p;
②. *p=10;
二、指標使用注意
①. 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的和與差(乙個函式返回兩個值)
1 #include2五、有關指標的疑問3 4 5 int sumandminus(int n1,int n2,int *n3)
6 7
14 15
16 17 int main()
18 19
注意:任何型別的指標都佔據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;
C語言基礎 指標基礎
最小儲存單位 bit 即 0 1 基本儲存單位 byte 1byte 8bit 注 計算機訪問的資料是byte位數定義變數 分配儲存空間 引用變數 通過變數名引用變數的內容即變數空間的首位址 為常量,即 變數名 專門儲存位址常量的變數型別 變數名所有指標變數均分配4byte的儲存空間 與其他變數相同...
C語言指標基礎
c語言指標 前導程式 includevoid change int int main void change int n 一 基本知識點 int a 10 int p 定義乙個int型別的指標 p a 指標變數p指向了變數a p 20 使用指標不通過變數直接修改變數a的值為20 p表示訪問指標變數p...
c語言指標回顧 指標基礎
學習c 已經快一年了,最近打算整理一下所學的知識,就當是系統地複習一遍,指標方面包括指標的簡單介紹 使用指標常見的錯誤 指標與陣列 指標與函式 指標陣列和陣列指標。任何剛開始學習c語言的人如果被難住了,那一定是卡在指標這邊了,其實指標並沒有這麼可怕,我這邊就挑兩個重點來講了,如下 1 指標是一種資料...