数组名是数组首元素的地址,是一个指针常量。
问题:
- 在C语言里定义了一个字符数组如果不初始化就打印字符数组里的内容会怎样?
- 函数调用时传递的字符指针的值与主函数里字符指针的值相同吗?
- 把字符串常量赋值给一个字符指针变量,指针的值怎么变,指针指向的内容是什么?
- 主函数调用子函数时传递了一个字符数组首地址,子函数把传递过来的字符指针重新指向一个字符串,函数调用结束后,主函数里的数组名指向哪里?
- 定义一个字符数组char str[16]; &str的含义是什么? str的含义是什么? str的含义是什么? (&str)的含义又是什么?
验证代码如下:
#include<stdio.h>
#include<stdlib.h>
void InitCharPointer(char *str)
{
printf("子函数字符指针变量str存放在内存里的位置为:%X\n\n", &(str));
printf("子函数字符指针变量str赋值前存放的地址为:%X\n\n", (str));
str = "Hello World!";
printf("子函数字符指针变量str赋值后存放的地址:%X\n\n", (str));
printf("子函数字符指针变量str赋值后的指向的内容为:%s\n\n", (str));
printf("子函数字符指针变量str赋值后*(&str)指向的内容为:%s\n\n", *(&str));
}
int main()
{
char str[16];
char p[50];
char *string;
printf("测试样例1:\n\n");
printf("主函数字符数组str的首地址为:%X\n\n", str);
printf("调用函数前主函数字符数组里的内容为:%s\n\n", str);
printf("主函数字符数组str的地址为:%X\n\n", &str);
printf("主函数字符数组str指向的内容为:%s\n\n",*(&str));
InitCharPointer(str);
printf("调用函数后主函数字符数组里的内容为:%s:\n\n", str);
system("pause");
return 0;
}
运行结果如下:
问题1答案
如果不初始化字符数组就打印字符数组里的内容,系统将会打印出一坨不可预料的值,而且每次运行都可能打印出不同的结果。
第一次运行结果
第二次运行结果
问题2答案
函数调用时传递的字符指针的值与主函数里字符指针的值是相同
问题3答案
把字符串常量赋值给一个字符指针变量,指针的值将被修改为该字符串常量的首地址,指向的内容为字符串常量
问题4答案
主函数调用子函数时,子函数把传递过来的字符指针重新指向一个字符串,函数调用结束后,主函数里的数组名的值不改变,因为
数组名是一个指针常量,地址不发生改变,而且子函数把(形参)字符指针重新指向了字符串常量,并没有对字符数组做任何改变,所以主函数里
的字符数组名指向的内容不会变化。
问题5答案
- &str指的是字符数组首元素的地址
- *str指的是字符数组首元素,即是字符str[0]
- str是数组名,存放了字符数组首元素的地址
- *(&str)指字符数组的值