指標:
變數型別 *變數名; 如: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 intmain()
;
//方式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;
}
#includechar
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)這裡的小括號千萬不能省略,固定格式
#includevoid
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...