星号 * 和取地址符&的关系
1.星号 * 代表一个内存地址,是一个数字 ,说明这个变量是个指针。
比如 char c = 'c';
int *p = &c;
p就是指针变量。是一个地址。比如0x1110011,还是个数字。
用 * p表示指向这个地址的结果,就是这个地址上存放的数据。
所以 * p 的打印结果是 'c';
2.取地址符号&是对变量取地址,得到这个变量的地址。
比如 int *p = &c;&c就是得到了"c"这个数据在内存中的地址。
*p 的打印结果 'c',根据指针得到数据。
所以星号 *+指针 结果是数据,&+数据 结果是地址。
至于二级指针啥的,道理一样。指针是个基本数据类型,代表数据的内存地址。
一、简单定义一个char类型的字符
char ca = 'a';
// int ca = 97;
printf("值 = %c\nASSIC码 = %d\n十六进制地址 = %p\n十进制地址 = %ld\n", ca, ca, &ca, &ca);
结果如下
字符的打印.png
在ASSCI的范围内127以下,每个字符都对应了一个数字。所以char类型可以说是int数字类型的。代码中用int定义ca,打印结果一样。
所以在ASSCI范围内,数字和字符本质上一样的。只是显示形式不一样。
比如a和97,如果想用字符的形式就用%c,如果想使用数字就用%d。
直接对这个变量打印,如果用%c形式显示字符,如果用%d打印就显示数字。
PS:十六进制地址和十进制地址结果数值相等。十进制看着方便些。
二、字符串
1.用数组形式定义数组
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);
结果
数组打印.png
可以看出,直接对字符串打印,显示内存地址,和取到的地址结果一样。
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
}
结果:
指针形式的字符串.png
用指针形式定义字符串,表示了一个指向一个字符串的地址。其实这个地址指向了字符串的首字母。有了首字母的地址就相当于这个字符串的地址。就像你和你的家庭,知道了你的位置,就知道了你整个家庭的位置一样。
星号 * str就是首字母。&*str就是首字母的地址,和str是同一个地址。
下面遍历字符串。str是首字母地址,每次自加1,表示紧挨着的下一个地址,指向了下一个字符。结果显示,首字母地址和str一致,更加证明了指针形式的字符串,指针是字符串的首字母地址。
网友评论