C与指针(小心引火自焚)

数组名是数组首元素的地址,是一个指针常量。
问题:

  1. 在C语言里定义了一个字符数组如果不初始化就打印字符数组里的内容会怎样?
  2. 函数调用时传递的字符指针的值与主函数里字符指针的值相同吗?
  3. 把字符串常量赋值给一个字符指针变量,指针的值怎么变,指针指向的内容是什么?
  4. 主函数调用子函数时传递了一个字符数组首地址,子函数把传递过来的字符指针重新指向一个字符串,函数调用结束后,主函数里的数组名指向哪里?
  5. 定义一个字符数组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)指字符数组的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值