有些概念的蜓斧、重要的東西時間過久了容易忘記列赎,好記性不如爛筆頭表鳍,記錄下來以便查閱
<stdio.h> 標(biāo)準(zhǔn)輸入輸出庫,是函數(shù)的申明逾冬,在編譯鏈接的時候會去找到相關(guān)函數(shù)的實(shí)現(xiàn)(通常是在編譯器的libs中黍聂。)
system("puase")(和getChar()一個效果);這句話其實(shí)是執(zhí)行的系統(tǒng)命令,假如命令為:mspaint則打開的是畫板(在windows中)
占位符:
int : %d
short: %d
long :%ld
float :%f
double :%lf
string :%s
十六進(jìn)制:%x
八進(jìn)制:%oscanf("");
define xxxx------>宏定義
void main() {
int i=0;
int* p = &i;
printf("%#x\n",p);
printf("%#x\n",&p);
printf("%d\n",*p);
}
代碼解讀:
1身腻、int* p申明一個int類型的(指針也是需要有類型的)指針類型的變量p产还,&為取地址符,表示存放i變量值的內(nèi)存地址嘀趟,而p變量的值存放為這個地址脐区,
輸出為:
0x5fbff75c ——>p的值,也就是i的地址
0x5fbff750 ——> 對指針變量p取地址她按,存放變量p的地址
0 ——>對*p取值牛隅,因?yàn)槭莗是指針變量,所以取到的是以p的值的內(nèi)存地址編號存放的值
- 形參和實(shí)參
void change(int p) {
p=100;
}
/**
* 相對于java中的值傳遞和應(yīng)用傳遞
*/
void main() {
int i=90;
int* p = &i;
change(i);
printf("%d\n",i);
}
這樣子的輸出是:90酌泰。因?yàn)榘褜?shí)參的值賦值給形參p媒佣,由于p是另外開辟的空間,改變p的值對i毫無影響宫莱。
如果想要i的值也要改變丈攒,就需要用到指針變量
void change(int *p) {
*p=100;
}
/**
* 相對于java中的值傳遞和應(yīng)用傳遞
*/
void main() {
int i=90;
int* p = &i;
change(p);
printf("%d\n",i);
}
- 指針的類型
指針也是有類型的
/**
* 指針的類型
*/
void main() {
int i=90;
int* p = &i;
double j = 89.2;
p = &j;
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(double));
printf("%lf\n",*p);
}
輸出:
4
8
0.000000
當(dāng)一個double類型變量的地址賦值給int類型的指針的時候哩罪,取值會不正確的授霸。因?yàn)橹羔榩是int類型,占4個字節(jié)际插,存放的是內(nèi)存當(dāng)中開始的地址碘耳,也就是開始的地址往后數(shù)四個字節(jié)。當(dāng)double類型的數(shù)據(jù)賦值給int指針p的時候框弛,double是八個字節(jié)辛辨,當(dāng)取值的時候p是int類型的指針只會去四個字節(jié)的值,所以取到的值只是高四位的值。
所以:指針保存的是地址開始的位置斗搞。
- 指針的運(yùn)算
/**
* 指針的運(yùn)算
*/
void main() {
int ids[] = {1,3,4,5,6,7};
printf("%#x\n",ids);
printf("%#x\n",&ids[0]);
}
輸出:
0x5fbff6e0
0x5fbff6e0
0x5fbff6e0
可以看到指攒,數(shù)組變量名的值,就是數(shù)組第一個元素的地址僻焚,&ids也是允悦,編譯器做了處理。
所以可以將數(shù)組變量名的值賦值給一個指針變量(*p)