Hacker_Jack 发表于 2017-3-9 20:54:14

带你学C e23的一个问题

#include <stdio.h>

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

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

      return 0;
}


甲鱼的代码如上, s1e23的指针数组,甲鱼明确写到指针数组是一个数组,每个元素存放一个指针变量
为什么这里的初始化是使用字符串来初始化的?为什么后续的输出也是用数组的下标法进行输出的?望知道的鱼油解答一二。

人造人 发表于 2017-3-9 21:05:13

本帖最后由 人造人 于 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");
        printf("%p\n", "fun");

        return 0;
}

test
sizeof :100
F
01176B30
请按任意键继续. . .

Hacker_Jack 发表于 2017-3-9 21:20:50

人造人 发表于 2017-3-9 21:05
因为字符串就是一个地址
举个例子^_^

那么是不是这样:
虽然数组指针 指向一个数组, 但是它不能指向一个指针数组
比如......//省略主体部分
char a, b ,c;
char *array = {&a, &b, &c};
char (*p) = &array;
是不合法的
是这样的吗?
是不是只有在 (*p) 前再加一个*号才行呢?

人造人 发表于 2017-3-9 21:42:03

Hacker_Jack 发表于 2017-3-9 21:20
那么是不是这样:
虽然数组指针 指向一个数组, 但是它不能指向一个指针数组
比如


char *t1; // t1是数组,数组里面存储指针
char (*t2); // t2是指针,指针指向数组

Hacker_Jack 发表于 2017-3-9 22:07:07

人造人 发表于 2017-3-9 21:42
char *t1; // t1是数组,数组里面存储指针
char (*t2); // t2是指针,指针指向数组

那为什么char (*t2) = &t1;不行呢
显示initialization from incompatible pointer type
t1是一个数组,我弄个t2指向它为什么告诉我类型不符呢?

人造人 发表于 2017-3-9 23:20:11

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

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

char t1;
char(*t2) = &t1;

人造人 发表于 2017-3-9 23:22:09

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

char *t1;
char *(*t2) = &t1;

zealstar 发表于 2017-3-10 10:19:25

我来解释一下吧,关于这句初始化:
      char *p1 = {
                "让编程改变世界 -- 鱼C工作室",
                "Just do it -- NIKE",
                "一切皆有可能 -- 李宁",
                "永不止步 -- 安踏",
                "One more thing... -- 苹果"
第一行也可以这样解释:
*p1 = {"让编程改变世界 -- 鱼C工作室"}
那么p1 = 字符串首地址(注意,没*的才是地址)

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

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

那么,从上面定义来看,char *p1这个指针数组里存储了5个首地址,他们分别是p1,p1,p1,p1,p1(还是请注意这里没*号)
所以,你的程序输出就变成printf("%s\n", p1),不知道这样解释会不会清楚一点!{:10_277:}
页: [1]
查看完整版本: 带你学C e23的一个问题