鱼C论坛

 找回密码
 立即注册
查看: 1567|回复: 7

[已解决]带你学C e23的一个问题

[复制链接]
发表于 2017-3-9 20:54:14 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

int main()
{
        char *p1[5] = {
                "让编程改变世界 -- 鱼C工作室",
                "Just do it -- NIKE",
                "一切皆有可能 -- 李宁",
                "永不止步 -- 安踏",
                "One more thing... -- 苹果"
        };
        int i;

        for (i = 0; i < 5; i++)
        {
                printf("%s\n", p1[i]);
        }

        return 0;
}
甲鱼的代码如上, s1e23的指针数组,甲鱼明确写到指针数组是一个数组,每个元素存放一个指针变量
为什么这里的初始化是使用字符串来初始化的?为什么后续的输出也是用数组的下标法进行输出的?望知道的鱼油解答一二。
最佳答案
2017-3-10 10:19:25
我来解释一下吧,关于这句初始化:
        char *p1[5] = {
                "让编程改变世界 -- 鱼C工作室",
                "Just do it -- NIKE",
                "一切皆有可能 -- 李宁",
                "永不止步 -- 安踏",
                "One more thing... -- 苹果"
第一行也可以这样解释:
*p1[0] = {"让编程改变世界 -- 鱼C工作室"}
那么p1[0] = 字符串首地址(注意,没*的才是地址)

和普通的字符串,比如char str[10]比较的话,就相当于没有指定字符数量而已,比如: char str[] ={"让编程改变世界 -- 鱼C工作室"},而str就是首地址!
(另外注意一点,str和p1[0]还是有区别的,这以后再行解释,但是基于字符串来说,用法很相似。)

字符串,实际上就是一个由char元素组成的数组,而输出时:
比如printf("%s", str)我们给出的str是数组的首地址,printf会根据"\0"所在位置自动判断输出多少个字符。

那么,从上面定义来看,char *p1[5]这个指针数组里存储了5个首地址,他们分别是p1[0],p1[1],p1[2],p1[3],p1[4](还是请注意这里没*号)
所以,你的程序输出就变成printf("%s\n", p1[i]),不知道这样解释会不会清楚一点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-9 21:05:13 | 显示全部楼层

回帖奖励 +3 鱼币

本帖最后由 人造人 于 2017-3-9 21:08 编辑

因为字符串就是一个地址
举个例子^_^
#include <stdio.h>

int main(void)
{
        char str[] = "test";
        printf("%s\n", str); // 数组名字是一个地址
        printf("sizeof :%s\n", "100");
        printf("%c\n", "Fishc"[0]);
        printf("%p\n", "fun");

        return 0;
}
test
sizeof :100
F
01176B30
请按任意键继续. . .

评分

参与人数 1鱼币 +2 贡献 +2 收起 理由
Hacker_Jack + 2 + 2 感谢帮助

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 21:20:50 | 显示全部楼层
人造人 发表于 2017-3-9 21:05
因为字符串就是一个地址
举个例子^_^

那么是不是这样:
虽然数组指针 指向一个数组, 但是它不能指向一个指针数组
比如
......//省略主体部分
char a, b ,c;
char *array[3] = {&a, &b, &c};
char (*p)[3] = &array;
是不合法的
是这样的吗?
是不是只有在 (*p) 前再加一个*号才行呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 21:42:03 | 显示全部楼层
Hacker_Jack 发表于 2017-3-9 21:20
那么是不是这样:
虽然数组指针 指向一个数组, 但是它不能指向一个指针数组
比如

char *t1[10]; // t1是数组,数组里面存储指针
char (*t2)[10]; // t2是指针,指针指向数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 22:07:07 | 显示全部楼层
人造人 发表于 2017-3-9 21:42
char *t1[10]; // t1是数组,数组里面存储指针
char (*t2)[10]; // t2是指针,指针指向数组

那为什么
char (*t2)[10] = &t1;
不行呢
显示initialization from incompatible pointer type  
t1是一个数组,我弄个t2指向它为什么告诉我类型不符呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 23:20:11 | 显示全部楼层
Hacker_Jack 发表于 2017-3-9 22:07
那为什么不行呢
显示initialization from incompatible pointer type  
t1是一个数组,我弄个t2指向它 ...

因为 t2是指针,指针指向数组

char t1[10];
char(*t2)[10] = &t1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 23:22:09 | 显示全部楼层
Hacker_Jack 发表于 2017-3-9 22:07
那为什么不行呢
显示initialization from incompatible pointer type  
t1是一个数组,我弄个t2指向它 ...

char *t1[10];
char *(*t2)[10] = &t1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-10 10:19:25 | 显示全部楼层    本楼为最佳答案   
我来解释一下吧,关于这句初始化:
        char *p1[5] = {
                "让编程改变世界 -- 鱼C工作室",
                "Just do it -- NIKE",
                "一切皆有可能 -- 李宁",
                "永不止步 -- 安踏",
                "One more thing... -- 苹果"
第一行也可以这样解释:
*p1[0] = {"让编程改变世界 -- 鱼C工作室"}
那么p1[0] = 字符串首地址(注意,没*的才是地址)

和普通的字符串,比如char str[10]比较的话,就相当于没有指定字符数量而已,比如: char str[] ={"让编程改变世界 -- 鱼C工作室"},而str就是首地址!
(另外注意一点,str和p1[0]还是有区别的,这以后再行解释,但是基于字符串来说,用法很相似。)

字符串,实际上就是一个由char元素组成的数组,而输出时:
比如printf("%s", str)我们给出的str是数组的首地址,printf会根据"\0"所在位置自动判断输出多少个字符。

那么,从上面定义来看,char *p1[5]这个指针数组里存储了5个首地址,他们分别是p1[0],p1[1],p1[2],p1[3],p1[4](还是请注意这里没*号)
所以,你的程序输出就变成printf("%s\n", p1[i]),不知道这样解释会不会清楚一点!

评分

参与人数 1鱼币 +5 贡献 +3 收起 理由
Hacker_Jack + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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