《C語言》 指標

2022-08-25 21:00:29 字數 4235 閱讀 4934

指標:

變數型別  *變數名;  如:int *p;

1.指標變數只能儲存位址;

2.指標就乙個作用,能夠根據乙個位址值,訪問對應的儲存空間;

3.指標變數p前面的int代表p只能指向int型別的資料;

在64位編譯器中,指標變數都是占用8個位元組,但是為什麼還要分為:char *p; int *p;等,是因為在取值時,*p會從p儲存的位址開始,取一定的位元組(如:int就會從p所儲存的位址開始向下4個位元組)

int *p; // 定義了乙個指向int型別資料的指標變數p

int a = 90; // 定義了乙個int型別的資料a = 90

*p = 10; // 對p所指向的儲存空間賦值(*)

解析:a = 90   -->   10;

int *p; 中的*和*p = 10;中的*意思是不一樣的;

int *p;中的*代表乙個指標變數(標誌)

*p = 10;中的*代表對p指向的儲存空間進行賦值

//不建議這樣寫 int *p 只能指向int型別的資料

//警告: warning: incompatible pointer types assigning to 'int *' from 'double *' [-wincompatible-pointer-types]

int *p;

double a = 10.0

;

p = &a;

//

指標變數只能儲存位址

//警告(warning: incompatible integer to pointer conversion assigning to 'int *' from 'int' [-wint-conversion])

int *p;

p = 200;

//

指標變數未經過初始化,不要拿來間接訪問其指向的儲存空間(不明確)

//沒有警告、輸出0

int *p;

printf(

"%d\n

", *p);

//

定義變數時的*僅僅是乙個象徵,沒有其他特殊含義

int a = 9

;

int *p = &a; //

定義變數時的*僅僅是乙個象徵,沒有其他特殊含義

//*p = &a;

//不正確的寫法

// 報警(warning: incompatible pointer to integer

conversion assigning to 'int' from 'int *'; remove & [-wint-conversion])

p = &a;

*p = 20; //

這裡的*的作用:訪問(賦值)指標變數p指向的儲存空間

printf(

"%d\n

", a);

例:int ages[5];

int *p;

p = ages; // 陣列名就是陣列首元素的位址

#include /*

一、陣列元素的訪問方式

1.陣列名[下標] 如:ages[i]

2.指標變數名[下標] 如:p[i] 前提是指標變數p指向陣列

3.*(p + i) 前提是指標變數p指向陣列

二、指標變數+1究竟加多少,取決於指標的型別

*/int

main()

;

/*// 方式1:遍歷整個陣列

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

*///

方式2:通過指標間接訪問陣列元素

int *

p;

p = &ages[0

];

//陣列名就是陣列的位址,也是陣列首元素的位址

//p = ages;

printf(

"%d\n

", *p); //

輸出 10

//輸出位址值

//總結:如果p指向陣列首元素(第0個元素),那麼p+1指向的就是第1個元素,p+2指向的就是第2個元素,並不是將位址值加1,這裡是加4,因為是int型別的指標

/*p ——> &ages[0]

p+1 ——> &ages[1]

p+2 ——> &ages[2]

p+i ——> &ages[i]

*/printf(

"%p\n

", p); //

輸出 0x7fff535e3c30

printf(

"%p\n

", p + 1); //

輸出 0x7fff535e3c34

printf(

"%p\n

", p + 2); //

輸出 0x7fff535e3c38

//方式2:通過指標間接訪問陣列元素

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

//訪問陣列元素的三種方式

//1.陣列名[下標] 如:ages[i]

printf("

%d\n

", ages[3]); //

輸出 56

//2.指標變數名[下標] 如:p[i]

printf("

%d\n

", p[3]); //

輸出 56

//3.*(p + i)

printf("

%d\n

", *(p + 3)); //

輸出 56

return

0;

char name = "itcast";

char *name = "itcast";

#include int

main()

;

//方式2:利用指標陣列

char *names2[3] = ;

//二、接受使用者輸入的字串

//1.先定義乙個字串用來儲存使用者輸入的字串

char names3[20

];

//char *names3;

//這裡不能用這種方式來定義乙個字串,因為這麼字串將來要接受使用者輸入的字元,是要變動

的,而這種方式定義的時乙個字串常量,執行時會程式奔潰(segmentation fault: 11)

//2.提示使用者輸入乙個字串

printf("

請輸入乙個字串:\n");

//3.接受使用者輸入的字串

//scanf("%s", &names3);

scanf("

%s", names3); //

陣列名就是位址,這裡的%s會將使用者輸入的字串從這個位址開始乙個乙個地存到names3這個字串變數內

//4.將接受到的字串列印出來

printf(

"%s\n

", names3);

return0;

}

#include 

char

test();

char *test2();

intmain()

//返回char型別的函式

char

test()

//返回指標(char型別)的函式

char *test2()

如:有乙個函式: double haha(int a, char *s, double b);

double (*p)(int, char *, double); //定義了乙個指向函式的指標

p = haha; // 將這個指向函式的指標指向haha函式 上面的兩句可以整合成一句: double (*p)(int, char *, double) = haha;

haha(10, "jake", 12.5);

p(10, "jake", 12.5);

(*p)(10, "jake", 12.5); //(*p)這裡的小括號千萬不能省略,固定格式

#include 

void

test();

int sum(int n1, int

n2);

intmain()

void

test()

int sum(int n1, int

n2)

C語言指標

指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...

C語言指標

1 定義指標變數void change int n 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 int main void change int n 2 指標與陣列 陣列名其實質是乙個指標,但是它和普通的指標變數還是...

c語言指標

編寫程式,在主函式裡用指標陣列輸入六個字串,再用另乙個函式對這六個字串排序,並在主函式中輸出排好序的字串。include void sort char s,int n char temp for int i 0 ifor int j 0 jif strcmp s j s j 1 0 temp s j...