星號(hào) * 和取地址符&的關(guān)系
1.星號(hào) * 代表一個(gè)內(nèi)存地址纺阔,是一個(gè)數(shù)字 ,說(shuō)明這個(gè)變量是個(gè)指針。
比如 char c = 'c';
int *p = &c;
p就是指針變量。是一個(gè)地址肛响。比如0x1110011,還是個(gè)數(shù)字惜索。
用 * p表示指向這個(gè)地址的結(jié)果特笋,就是這個(gè)地址上存放的數(shù)據(jù)。
所以 * p 的打印結(jié)果是 'c';
2.取地址符號(hào)&是對(duì)變量取地址巾兆,得到這個(gè)變量的地址猎物。
比如 int *p = &c;&c就是得到了"c"這個(gè)數(shù)據(jù)在內(nèi)存中的地址角塑。
*p 的打印結(jié)果 'c'蔫磨,根據(jù)指針得到數(shù)據(jù)。
所以星號(hào) *+指針 結(jié)果是數(shù)據(jù)圃伶,&+數(shù)據(jù) 結(jié)果是地址质帅。
至于二級(jí)指針啥的,道理一樣留攒。指針是個(gè)基本數(shù)據(jù)類型,代表數(shù)據(jù)的內(nèi)存地址嫉嘀。
一炼邀、簡(jiǎn)單定義一個(gè)char類型的字符
char ca = 'a';
// int ca = 97;
printf("值 = %c\nASSIC碼 = %d\n十六進(jìn)制地址 = %p\n十進(jìn)制地址 = %ld\n", ca, ca, &ca, &ca);
結(jié)果如下在ASSCI的范圍內(nèi)127以下,每個(gè)字符都對(duì)應(yīng)了一個(gè)數(shù)字剪侮。所以char類型可以說(shuō)是int數(shù)字類型的拭宁。代碼中用int定義ca洛退,打印結(jié)果一樣。
所以在ASSCI范圍內(nèi)杰标,數(shù)字和字符本質(zhì)上一樣的兵怯。只是顯示形式不一樣。
比如a和97腔剂,如果想用字符的形式就用%c媒区,如果想使用數(shù)字就用%d。
直接對(duì)這個(gè)變量打印掸犬,如果用%c形式顯示字符袜漩,如果用%d打印就顯示數(shù)字。
PS:十六進(jìn)制地址和十進(jìn)制地址結(jié)果數(shù)值相等湾碎。十進(jìn)制看著方便些宙攻。
二、字符串
1.用數(shù)組形式定義數(shù)組
char str1[] = "123abc";
printf("%s\n直接打印 = %ld\n地址 = %ld\n\n", str1, str1, &str1);
char first = str1[1];
printf("%c\nASSIC碼 = %d\n地址 = %ld\n", first, first, &first);
結(jié)果
可以看出介褥,直接對(duì)字符串打印座掘,顯示內(nèi)存地址,和取到的地址結(jié)果一樣柔滔。
2.用指針形式定義字符串
char *str = "abc123";
printf("%s\n地址 = %ld\n首字符 = %c\n首字符地址 = %ld\n\n",str, str, *str, &*str);
while (*str != '\0') {
printf("ASSIC碼 = %d 值 = %c 地址 = %ld\n", *str, *str, str);
str++; //地址+1
}
結(jié)果:用指針形式定義字符串溢陪,表示了一個(gè)指向一個(gè)字符串的地址。其實(shí)這個(gè)地址指向了字符串的首字母廊遍。有了首字母的地址就相當(dāng)于這個(gè)字符串的地址嬉愧。就像你和你的家庭,知道了你的位置喉前,就知道了你整個(gè)家庭的位置一樣没酣。
星號(hào) * str就是首字母。&*str就是首字母的地址卵迂,和str是同一個(gè)地址裕便。
下面遍歷字符串。str是首字母地址见咒,每次自加1偿衰,表示緊挨著的下一個(gè)地址,指向了下一個(gè)字符改览。結(jié)果顯示下翎,首字母地址和str一致,更加證明了指針形式的字符串宝当,指針是字符串的首字母地址视事。