標籤:style blog color 使用 os io strong 資料
一、指標變數的定義
1. 格式:變數類型 *指標變數名;
2. 舉例:int *p; char *p2;
3. 注意:定義變數時的*僅僅是指標變數的象徵
4.指標變數只能儲存地址
5.指標就一個作用:能夠根據一個地址值,訪問對應的儲存空間
6.指標變數p前面的int:指標變數p只能指向int類型的資料
7.任何指標都佔用8個位元組的儲存空間
二、利用指標變數簡單修改其他變數的值
1.指向某個變數
int a;
int *p;
p = &a;
或者
int *p = &a;
2.修改所指向變數的值
*p = 10; //這個時候的*的作用:訪問指向變數p指向的儲存空間
3.在函數內部修改外面變數的值
int a = 10;
change(&a);
void change(int *n)
{
*n = 20;
}
4.清null 指標
p = 0;
p = null;
5.指標變數未經過初始化,不要拿來間接訪問其他儲存空間
三、指標與數組
將數組當做函數參數傳入時,會自動轉為指標,
1>利用一個指標來接收一個數組,指標變數p指向了數組的首元素
p = &ages[0];
2>數組名就是數組的地址,也是數組首元素的地址
p = ages;
1.數組元素的訪問方式
int ages[5];
int *p;
p = ages;
1> 數組名[下標] ages[i]
2> 指標變數名[下標] p[i]
3> *(p + i)
/*
p ---> &ages[0]
p + 1 ---> &ages[1]
p + 2 ---> &ages[2]
p + i ---> &ages[i]
*/
2.指標變數+1,地址值究竟加多少,取決於指標的類型
int * 4
char * 1
double * 8
四、指標與字串
1.定義字串的2種方式
1> 利用數組
char name[] = "itcast";
* 特點:字串裡面的字元是可以修改的
* 使用場合:字串的內容需要經常修改
2> 利用指標
char *name = "itcast";
* 特點:字串其實是一個常量字串,裡面的字元是不能修改
* 使用場合:字串的內容不需要修改,而且這個字串經常使用
2.定義字串數組
1> 利用二維字元數組
char names[2][10] = {"jack", "rose"};
2> 利用指標數組
char *names[2] = {"jack", "rose"};
3.指標變數指向字串的首字元
五、返回指標的函數
l 指標也是C語言中的一種資料類型,因此一個函數的傳回值肯定可以是指標類型的
l 返回指標的函數的一般形式為:類型名 * 函數名(參數列表)
1 #include <stdio.h> 2 char *test(); 3 4 /* 5 只要求能看懂 6 */ 7 8 int main() 9 {10 char *name = test();11 12 printf("name=%s\n", name);13 14 return 0;15 }16 17 char *test()18 {19 return "rose";20 }
六、指向函數的指標
1. 為什麼指標可以指向一個函數?
函數作為一段程式,在記憶體中也要佔據部分儲存空間,它也有一個起始地址,即函數的入口地址。函數有自己的地址,那就好辦了,我們的指標變數就是用來儲存地址的。因此,可以利用一個指標指向一個函數。其中,函數名就代表著函數的地址。
2. 指向函數的指標的定義
定義的一般形式:函數的傳回值類型 (*指標變數名)(形參1, 形參2, ...);
3. 使用注意
l 由於這類指標變數儲存的是一個函數的入口地址,所以對它們作加減運算(比如p++)是無意義的
l 指向函數的指標變數主要有兩個用途:
調用函數
將函數作為參數在函數間傳遞
1 void test1() 2 { 3 // (*p)是固定寫法,代表指標變數p將來肯定是指向函數 4 // 左邊的void:指標變數p指向的函數沒有傳回值 5 // 右邊的():指標變數p指向的函數沒有形參 6 void (*p)(); 7 8 // 指標變數p指向了test函數 9 p = test;10 11 p();12 //(*p)(); // 利用指標變數間接調用函數13 14 //test(); // 直接調用函數15 }
七、指向指標的指標
1 #include <stdio.h> 2 int main() 3 { 4 int a = 10; 5 6 int *p = &a; 7 8 int **pp = &p; 9 10 // a = 20;11 12 // *p = 20;13 14 /*15 (*pp) == p16 17 *(*pp) == *p = a18 19 **pp == *p = a20 */21 **pp = 20;22 23 printf("%d\n", a);24 25 //int ***ppp = &pp;26 27 /*28 char a2 = ‘A‘;29 char *p2 = &a2;30 */31 32 return 0;33 }