一、C语言中,数组和字符串
- 1、C语言中,定义一个数组后,数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针,但是这个指针不能重新指向。
- 2、字符串在C语言中是通过字符数组来实现的,也就是说字符串还是保存在数组里面的。字符串实际上是一个字符序列,它以空字符(null character,即\0)作为结束标志。这意味着在C语言中,当你声明一个字符串时,你需要为这个空字符预留一个额外的位置,因为字符串的长度(不包括结尾的空字符)和数组的大小之间有一个单位的差异。
char greeting[6] = "Hello"; // 这是不正确的,因为数组大小不足以存储结束符'\0'
char greeting[7] = "Hello"; // 正确的,'\0'会被自动添加到数组的末尾
char greeting[] = "Hello";
char *ptr = greeting;
printf("%c\n", *ptr); // 输出 'H'
二、数组名相关的打印内容
#include "stdio.h"
int main() {
char greeting[] = "Hello";
char *ptr = greet;
// printf("%c\n", *ptr); //
printf("指针使用s: %s\n", ptr); // 指针指向数组名, 打印这个指针的值,格式化输出的是字符,就打印出这个字符的内容
printf("指针使用p: %p\n", ptr); // 指针指向数组名,打印这个指针的内容,格式化输出的是地址,就打印出这个字符的地址
printf("指针加上求地址符的p: %p\n", &ptr); // 这个打印出来的是指针的地址。
printf("变量名使用s: %s\n", greet);
printf("变量名使用p: %p\n", greet);
printf("变量名加上求地址符的地址: %p\n", &greet);
return 0;
}
-
可以看出数组变量名本身就可以当成一个保存元素地址的变量
-
容易混淆的地方:数组名greet的使用
-
1、如果对这个变量使用求地址符,&greet,这个值和ptr的值一样,并不是ptr地址的地址。greet是第一个元素的地址,&greet是这个数组的地址。
- 如果用一个指针先指向数组名,再求地址,结果就不一样了,结果就是greet地址的地址
-
2、数组名保存的地址,是第一个元素的地址,这个也很模糊。我们说的 数组的地址和数组第一个元素的地址,这两个地址打印出来是一样的。那为什么要强调这两个地址的不同呢?
因为指针不仅要确认指向的地址的开头,还要确认这个地址怎么解析。如果是char类型,就按char类型取出,如果是数组类型,就按这个数组的类型,取出这个存放在数组里的数。所以强调不同的原因是因为它们的类型是不同的。