鱼C论坛

 找回密码
 立即注册
查看: 867|回复: 9

[已解决]字符型 指针数组

[复制链接]
发表于 2020-12-13 11:35:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬,救救救
看了小甲鱼的视频,
指针数组不是储存的是地址嘛
char *p[];
储存的是字符型指针变量,为什么能输入中文呢,还能打印出来,想了一晚上没搞懂


#include <stdio.h>
int main()
{
    char *p[3]={
        "为什么呀",
        "为什么能输入中文嘛",
        "char 指针变量"
    };
    for(int i=0;i<3;i++)
    printf("%s ",p[i]);
    printf("\n");
}

另外   我换成
printf("%c",*p[I])
数出来的是什么呀
最佳答案
2020-12-13 11:52:05
本帖最后由 jackz007 于 2020-12-13 12:12 编辑
    char *p[3]={
        "为什么呀",
        "为什么能输入中文嘛",
        "char 指针变量"
    };

       内存里放入了这些东西,p 作为指针,只是记录了存放这些东西的内存地址(其实就是一个整数值),以便可以通过 p 来访问到字符串数组中的每一个字符串和字符元素。
       就好比在 12000000 存储单元中存放了这些字符串数组,当需要使用的时候,你不得到内存的 120000000 单元去取这些东西呀,是的,在这里,p 的值就是 12000000,这就是 p 的作用和存在意义。

       p 是拥有 3 个元素的指针数组,里面储存了 3 个指针,分别指向 3 个字符串的开头,所以,我们可以通过 p[0]、p[1]、p[2] 分别访问到三个字符串,p[0] 是内存地址,那么 * p[0] 所表达的自然就是第一个字符串中的第一个字符。这个字符在 printf() 中,得通过格式描述符 "%c" 才能把它显示成字符。当然,这就意味着你也可以选择用 "%d",这样的话,你所看到的就不是字符本身,而是它的字符编码值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-13 11:36:39 | 显示全部楼层
助けてください ありがとうございます
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 11:52:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-13 12:12 编辑
    char *p[3]={
        "为什么呀",
        "为什么能输入中文嘛",
        "char 指针变量"
    };

       内存里放入了这些东西,p 作为指针,只是记录了存放这些东西的内存地址(其实就是一个整数值),以便可以通过 p 来访问到字符串数组中的每一个字符串和字符元素。
       就好比在 12000000 存储单元中存放了这些字符串数组,当需要使用的时候,你不得到内存的 120000000 单元去取这些东西呀,是的,在这里,p 的值就是 12000000,这就是 p 的作用和存在意义。

       p 是拥有 3 个元素的指针数组,里面储存了 3 个指针,分别指向 3 个字符串的开头,所以,我们可以通过 p[0]、p[1]、p[2] 分别访问到三个字符串,p[0] 是内存地址,那么 * p[0] 所表达的自然就是第一个字符串中的第一个字符。这个字符在 printf() 中,得通过格式描述符 "%c" 才能把它显示成字符。当然,这就意味着你也可以选择用 "%d",这样的话,你所看到的就不是字符本身,而是它的字符编码值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-13 12:11:17 | 显示全部楼层
jackz007 发表于 2020-12-13 11:52
内存里放入了这些东西,p 作为指针,只是记录了存放这些东西的内存地址(其实就是一个整数值), ...
printf("%s ",p[i]);
请问那 这个什么意思呀 读出字符串地址吗,不是读出字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 12:17:24 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-13 12:20 编辑
万千只cnm 发表于 2020-12-13 12:11
请问那 这个什么意思呀 读出字符串地址吗,不是读出字符串?


      p 是指针数组,和一般的数组是一样的,只不过它的每一个元素都是指针,指向一个内存地址,比如,p[0] 中保存的就是指向第一个字符串 "为什么呀" 起始地址的指针;p[1] 中保存的就是指向第二个字符串 "为什么能输入中文嘛" 起始地址的指针,凡此类推。
      所以,才可以通过
        for(int i = 0 ; i < 3 ; i ++) printf("%s " , p[i]) ;
      打印输出 3 个字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-13 12:44:11 | 显示全部楼层
jackz007 发表于 2020-12-13 12:17
p 是指针数组,和一般的数组是一样的,只不过它的每一个元素都是指针,指向一个内存地址,比如, ...

那所以 %s      相当于通过起始地址p[i] 来读取字符串嘛
%c,*p[i]     相当于读取字符串第一个字符吗
我可能表达不太清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 12:52:33 | 显示全部楼层
万千只cnm 发表于 2020-12-13 12:44
那所以 %s      相当于通过起始地址p 来读取字符串嘛
%c,*p     相当于读取字符串第一个字符吗
我可能 ...

        是的,"%s" 会从一个内存地址开始向后逐一读取字符元素,直到读到 '\0' 为止。"%c" 会把一个一字节整数作为字符编码显示成字符。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 14:29:35 | 显示全部楼层
char *p[3]    是指定义了3个字符数据的指针。。 每个指针相当于字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-13 19:24:04 | 显示全部楼层
Dadong丶 发表于 2020-12-13 14:29
char *p[3]    是指定义了3个字符数据的指针。。 每个指针相当于字符串。

为什么相当于字符串呢
不是指向地址嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-13 21:42:50 | 显示全部楼层
万千只cnm 发表于 2020-12-13 19:24
为什么相当于字符串呢
不是指向地址嘛

定义了三个字符数据的指针,, 每个指针 都指向第一个字符的地址,  '\0'结束。 所以,每个相当于一个字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表