一,程序中的c語言指針
int a,b; //這是一個普通的整型變量
int *p;//這是一個整形的指針
a = 3;
b = 4;
6
printf(" a的地址:%d;\r\n", &a);
printf(" b的地址:%d;\r\n", &b);
printf(" p的地址:%d;\r\n", &p);
printf(" p的值:%d,現在p的值是不確定的,目前只是為p申請了地址,還沒有為它賦值;\r\n", p);
p = &a;//取址運算/* p現在指向a */
printf(" 利用取址操作p = &a;,把a的地址賦值給p,現在p的值是%d,也就是a的地址;\r\n", p);
printf(" p的地址沒有變化,p的地址仍然是%d,在這個地址上存儲的是變量a的地址;\r\n", &p);
printf(" 利用*運算符得到指針p指向地址中的數值為%d,在剛才p已經指向變量a的地址了,所以指針p指向地址中的值是3,但是p的值仍然是a的地址;\r\n", *p);
b = *p;/* b現在為a的值 */
printf(" b = *p;,現在b的值就是p指向地址中的值,也就是a的值:%d;\r\n", b);
*p = 5;/* a現在為5 */
printf(" 現在利用*p為p指向地址中存儲的值進行賦值:%d,這時a的值也已經改變了:%d;\r\n", *p,a);
int a,b; //這是一個普通的整型變量 int *p;//這是一個整形的指針 a = 3; b = 4;
printf(" a的地址:%d;\r\n", &a);
printf(" b的地址:%d;\r\n", &b);
printf(" p的地址:%d;\r\n", &p);
printf(" p的值:%d,現在p的值是不確定的,目前只是為p申請了地址,還沒有為它賦值;\r\n", p);
指針p定義的時候沒有進行初始化,所以在這里,p的初始值是不確定的。 當然也可以在p定義的時候賦初值,這樣p的初始值就是確定的了。
p = 1;
一元運算符&可用於取一個對象的地址,如下,這時p為指向a的指針。地址運算符&只能應用於內存中的對象,即變量與數組元素。它不能作用於表達式、常量或register類型的變量。
這時p的值是3930420,即變量a的地址;
利用&取出p的地址仍然為3930396,沒有變;
利用間接尋址,p可以得到指針p指向地址中的值為3,即a的值。
p = &a;//取址運算/* p現在指向a */ printf(" 利用取址操作p = &a;,把a的地址賦值給p,現在p的值是%d,也就是a的地址;\r\n", p); printf(" p的地址沒有變化,p的地址仍然是%d,在這個地址上存儲的是變量a的地址;\r\n", &p);
p = &a;//取址運算/* p現在指向a */
printf(" 利用取址操作p = &a;,把a的地址賦值給p,現在p的值是%d,也就是a的地址;\r\n", p);
printf(" p的地址沒有變化,p的地址仍然是%d,在這個地址上存儲的是變量a的地址;\r\n", &p);
printf(" 利用*運算符得到指針p指向地址中的數值為%d,在剛才p已經指向變量a的地址了,所以指針p指向地址中的值是3,但是p的值仍然是a的地址;\r\n", *p);
利用*可以得到p地址中的數值,這里b的值就是3,即a的值。
b = *p;/* b現在為a的值 */
printf(" b = *p;,現在b的值就是p指向地址中的值,也就是a的值:%d;\r\n", b);
對*p進行賦值后,也就是對p指針指向地址中的數值進行賦值,這是a的值也就變為了5
*p = 5;/* a現在為5 */
printf(" 現在利用*p為p指向地址中存儲的值進行賦值:%d,這時a的值也已經改變了:%d;\r\n", *p,a);
二,圖解C語言指針
定義兩個變量
int a=3,b; //這是一個普通的整型變量
int *p;//這是一個整形的指針
定義后,a的地址是0x2000,p的地址是0x3000; 在定義的時候a賦的初始值是3,p沒有賦初始值,所以p的值是不確定的。
現在進行運算:
p = &a;//取址運算/* p現在指向a */
這時內存圖就變成了這樣,p的地址沒有變化,但是p的值變化了,此時,*p=3;
三,指針與函數
指針作為函數的形參
在程序設計中,指針作為函數形參往往會帶來意想不到的效果,下面用一個例程來講解指針作為函數形參的特性。 例子:用一個函數交換兩個變量的值:
void Swap(int x, int y)
{
int temp = 0;
temp = x;
x = y;
y = temp;
}
void Swap_pointer(int *x, int *y)
{
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
/*
指針與函數
2019-05-09
*/
void Test2()
{
int a = 1, b = 2;
Swap(a, b);
printf("a=%d\r\n", a);
printf("b=%d\r\n", b);
Swap_pointer(&a, &b);
printf("\r\n");
printf("a=%d\r\n", a);
printf("b=%d\r\n", b);
}
執行結果如下圖,可以明顯的看出指針作為函數形參的特性。
具體講解詳見《C語言程序設計》的5.2章節。
指針,結構體與函數
下面的介紹都是圍繞這段函數來講解的
/*
xutopia
*/