//C語言第八講,指針
// 數據的訪問方式直接訪問(直接訪問內存單元中的內容)和間接訪問(通過內存單元編號以及數據所佔字節數,訪問內存中的數據)
//直接訪問
// int a=20;//(一個字節佔八位)
// 字節和位
// 字節是最小的存儲單元,一個字節被稱爲一個存儲單元(內存單元),不同的數據類型所佔的存儲單元也不同
// 一個字節佔八位
//基本數據類型
/*char 一個字節 一個內存單元
short 兩個字節 兩個內存單元
int 四個字節 四個內存單元
long四或八個字節 四或八個內存單元
float四字節 四個內存單元
double八字節 八個內存單元*/
// 爲了正確訪問內存單元,每個內存都有一個編號。內存單元的編號稱作地址。
// 內存地址==地址==內存單元編號
// 內存單元中的 內容纔是我們關注的 數據
// 指針就是內存地址。我們習慣上把內存地址叫做指針(內存地址簡稱爲地址)
// & 取址符可以查看一個內存變量的內存地址(內存首地址)
// 格式化輸出內存地址用%p
// int a=6666;
// printf("&a(a的內存地址) = %p\n",&a);
//
// int b=45,c;
// printf("&b(b的內存地址) = %p\n",&b);
// printf("&c(c的內存地址) = %p\n",&c);
// double d=3.1415926;
// printf("&d(d的內存地址) = %p\n",&d);
// char r='k';
// printf("&r(r的內存地址) = %p\n",&r);
// char s='s';
// printf("&s(s的內存地址) = %p\n",&s);
// &取的只是首地址,並不是a只佔這一個內存地址,變量a的數據類型決定a佔幾個內存地址
// 指針變量:存放內存地址的變量;
// 基本數據類型 * 變量名 =內存地址;
// int *q= NULL;//恆等於0;
// printf("q=%p\n",q);
//取值操作符:*。我們通過*來訪問內存單元中存儲的數據。(*取值,&取址)
// int a=110;
// printf("a=%p\n",&a);
// int *p =&a;
// printf("p=%p\n",p);
// printf("a=%d\n",*p);
// printf("a=%d\n",a);
// float b=3.1415;
// printf("b=%p\n",&b);
// float *p =&b;
// printf("p=%p\n",&b);
// printf("b=%f\n",b);
// printf("b=%f\n",*p);
// char c='k';
// printf("c=%p\n",&c);
// char *p=&c;
// printf("p=%p\n",p);
// printf("c=%c\n",*p);
// printf("c=%c\n",c);
// double d=0.618;
// printf("d=%p\n",&d);
// double *p=&d;
// printf("p=%p\n",p);
// printf("d=%f\n",d);
// printf("d=%f\n",*p);
//
// long e=140;
// printf("e=%p\n",&e);
// long *k=&e;
// printf("k=%p\n",k);
// printf("e=%ld\n",e);
// printf("k=%ld\n",*k);
//
//指針的重指向,
//指針變量的賦值意味着重新指向,而不是同時指向多個地址
// int a=3,b=5;
// printf("a=%p\n",&a);
// printf("b=%p\n",&b);
// int *p=&a;
// p=&b;
// printf("p=%d\n",*p);
// printf("p=%p\n",p);
// int *p;(整形指針)
// double *q;(雙精度)
// char *g;()
// 指針變量所佔字節數 只與 操作系統有關(32位操作系統下佔4字節,64位操作系統下佔8字節)
//
// int a=20;
// int *p=&a;
// printf("SizeA = %lu\n",sizeof(a));
// printf("SizeP = %lu\n",sizeof(p));
// 特別注意
// int *j = &a;//如果出現*的地方,前邊有任何類型修飾符,比如(int char等),此時*僅僅起到表示作用,告訴編譯器這是一個指針變量(取地址)
// *j=337; // 如果出現*的地方,前邊沒有任何類型修飾符,此時*代表取值操作符,他會把指針指向的區域中的內存取出來(取值)
// j;// 如果前邊沒有*和類型修飾符,那麼這個變量就是一個指針變量,它裏邊存儲着某一個內存地址
// 指針賦值
// C語言允許使用賦值運算符對指針進行賦值;
// int i,j,*p,*q;
// p=&i;
// q=&j;
// i=1;
// *q=*p;//如果*p=*q,則輸出結果位0;
// printf("j=%d\n",j);
// printf("p=%p\n",p);
// printf("q=%p\n",q);
// printf("*p=%d\n",*p);
// printf("*q=%d\n",*q);
// 練習定義一個函數,並且在內部修改外部變量的值;
int value=99;
printf("&value=%p\n",&value);
printf("value=%d\n",value);
changeValue(value);
printf("value=%d\n",value);
/*前面的定義
//函數聲明
void changeValue(int value);
//函數定義
void changeValue(int value){
value = 998;
printf("value=%d\n",value);
}