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 ...