C語言學習入門 五 指標

2021-06-27 09:39:17 字數 3495 閱讀 5161

chara;

a = 10;

程式內部是怎麼操作的呢?

其實,程式對變數的讀寫操作,實際上是對變數所在的儲存空間進行寫入或取出資料。就上面的**而言,

系統會自動將變數名a轉換為變數的儲存位址,根據位址找到變數a的儲存空間,然後再將資料10以2進製的形式放入變數a的儲存空間中。

通過變數名引用變數,由系統自動完成變數名和其儲存位址之間的轉換,稱為變數的"直接引用"方式

如 將變數a的位址存放在另乙個變數中,比如存放在變數b中,然後通過變數b來間接引用變數a,間接讀寫變數a的值。這就是

"間接引用"

總結一句:用來存放變數位址的變數,就稱為"指標變數"。在上面的情況下,變數b就是個"指標變數",我們可以說指標變數b指向變數a。

一般形式:類名識別符號*指標變數名;

int*p;

float*q;

inta = 

10;int *p = &a;      float b = 2.3f;   float *q; q = &b;

char a = 10;

printf("修改前,a的值:%d\n", a);

// 指標變數p指向變數a

char *p = &a;//這個*  是定義指標的說明符

// 通過指標變數p間接修改變數a的值

*p = 9;

//這個* 是指標運算子,表示 把9賦值給  指標指向的位址a,也就相當於 a = 9;

//這裡 就是間接修改a的值

printf("修改後,a的值:%d", a);

char a = 10;

char *p;

p = &a;

char value = *p;

//根據p值(即變數a的位址)訪問對應的儲存空間,並取出儲存的內容(即取出變數a的值),賦值給value

printf("取出a的值:%d", value);

在指標變數沒有指向確定位址之前,不要對它所指的內容賦值。下面的寫法是錯誤的

int*p; 

*p = 10; //

這是錯誤的

應該在指標變數指向乙個確定的變數後再進行賦值。下面的寫法才是正確的

// 定義2個int型變數

int a = 6

, b;

// 定義乙個指向變數b的指標變數p

int*p;

p = &b;

// 將a的值賦值給變數b

*p = a;

交換兩個字元變數的位址(改變實參的值)

void swap(char *p,char *q)

int main(int argc,const

char * argv)

int a[2] = ;   int *p = &a[0];  *p = 10;  那麼 a[0]應該等於10

陣列名a 的位址 與 它的第乙個元素的位址相同,  所以  p = &a[0] 與 p = a 效果一樣 

int ary = ;

int *q = ary;

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

形引數組,實參指標

void change(int b)

int main()

;int *p = a;

// 將陣列名a傳入change函式中

change(p);

// 檢視a[0]

printf("a[0]=%d", a[0]);

return 0;

}形參指標,實參陣列

void change(int *b)

int main()

;// 將陣列名a傳入change函式中

change(a);

// 檢視a[0]

printf("a[0]=%d", a[0]);

return 0;

}   //可以看出,在很多情況下,指標和陣列是可以相互切換使用的。但是,並不能說指標就等於陣列

char chs ="abcde";

char *p;

p = chs;

for (; *p != '\0';p++)

printf("\n");

char *p ="abcde";   

strlen(

"abde」

);size_t     strlen(const

char *);

char    *strcpy(char *,const

char *);// 

字串拷貝函式

char    *strcat(char *,const

char *);// 

字串拼接函式

int     strcmp(const

char *, const

char *); // 

字串比較函式

它們的引數都是指向字元變數的指標型別,因此可以傳入指標變數或者陣列名。

1chars[

10];

2s ="mj"

; //編譯器肯定報第2行的錯,因為s是個常量,代表陣列的首位址,不能進行賦值運算

1char *s ="mj";

2 3 *s = "like";

第3行**犯了2個錯誤:

返回指標的函式的一般形式為:型別名*函式名(引數列表)

//將字串str中的小寫字母變成大寫字母,並返回改變後的字串

//注意的是:這裡的引數要傳字串變數,不能傳字串常量

char * upper(char *str) 

// 遍歷下乙個字元

str++;

}// 返回字串

return dest;

}int main()

定義的一般形式:函式的返回值型別(*指標變數名)(形式引數1,形式引數2, ...);

注意:形式引數的變數名可以省略,甚至整個形式引數列表都可以省略

int sum(int a,int b)

int main()

將函式作為引數

void get(int (*q)(int a,char b), float c) {}

C語言學習(五)指標

int main int i 定義整型變數 int 為指向整型資料的指標變數 inta n 定義整型陣列 它有 個元素 int 定義指標陣列 它由 個指向整型資料的指標元素組成 int p為指向含n個元素的一維陣列的指標變數 int f 為帶回整型函式值的函式 int 為帶回乙個指標的函式,該指標指...

C語言學習筆記(五)指標

指標格式 變數型別 變數名 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 一 指標變數的定義 1.格式 變數型別 指標變數名 2.舉例 int p char p2 3.注意 定義變數時的 僅僅是指標變數的象徵 二 利用...

C語言學習筆記(五)指標

4 指標與陣列 為什麼陣列傳進函式後sizeof不對了?5 指標和const 指標本身和所指的變數都可能const 二 指標運算 scanf d i int i printf p i int i int p i int p,q int p,q 在函式裡面可以通過這個指標訪問外面的這個i voidf ...