黄jz 发表于 2021-9-15 09:10:15

请问这个指针数组赋值给数组指针怎么理解

int main()
{
      char *array = {"FishC", "Five", "Star", "Good", "WoW"};
      char *(*p) = &array;
}

jhanker 发表于 2021-9-15 09:43:54

1.array是指针数组,里面的每一项存的内容都是一个字符串的地址,比如array的内容是字符串"FishC"的首地址,(从下面代码运行结果可以看出来)
2. char *array 也许写成 char* array 更容易理解 类型: char*数据结构:数组
3. char *(*p) = &array 相当于   char* array 的 array 用 *p替代 说明 p是指针 p的内容是数组array的首地址,(从下面代码运行结果可以看出来)

#include<stdio.h>
int main()
{
        char *array = {"FishC", "Five", "Star", "Good", "WoW"};
        char *(*p) = &array;
        printf("array的内容: %d\n",array);
    printf("array指向的内容: %s\n",array);
        printf("array的地址(与array数组的首地址): %d\n",&array);
        printf("p的内容(即array数组的首地址): %d\n",p);
        printf("array的内容: %d\n",(*p));
    printf("array指向的内容: %s\n",(*p));
        printf("array的地址(与array数组的首地址): %d\n",&(*p));
                return 0;
}

黄jz 发表于 2021-9-15 10:07:47

jhanker 发表于 2021-9-15 09:43
1.array是指针数组,里面的每一项存的内容都是一个字符串的地址,比如array的内容是字符串"FishC"的首 ...

*p本身不就是一个指向数组的指针吗,不能直接把array的数组地址直接赋值给他吗...我就不懂为什么定义时要再加一个*

jhanker 发表于 2021-9-15 10:35:27

array地址,array,&array 表示的是同一个地址,但他们的含义不一样,而编译器是要检查类型是否一致的,&array表示数组的第一项的地址,array编译器代表的也是第一项的地址,而&array表示整个数组五项的一起的首地址。
钱看代码
#include<stdio.h>
int main()
{
        char *array = {"FishC", "Five", "Star", "Good", "WoW"};
        char *(*p) = &array;
        printf("array的内容: %d\n",array);
    printf("array指向的内容: %s\n",array);
        printf("array的地址(与array数组的首地址): %d\n",&array);
        printf("p的内容(即array数组的首地址): %d\n",p);
        printf("array的内容: %d\n",(*p));
    printf("array指向的内容: %s\n",(*p));
        printf("array的地址(与array数组的首地址): %d\n",&(*p));
        printf(": array第一项的地址%d,array第二项的地址%d\n", array, array+1);
        printf(": array的地址%d,array数组后面的地址%d\n", &array, &array+1);
                return 0;
}
运行后看看地址的偏移量

jhanker 发表于 2021-9-15 10:38:00

看看运行结果,点击图片放大后能看清楚

黄jz 发表于 2021-9-15 12:45:34

本帖最后由 黄jz 于 2021-9-15 12:47 编辑

jhanker 发表于 2021-9-15 10:35
array地址,array,&array 表示的是同一个地址,但他们的含义不一样,而编译器是要检查类型是否一致的, ...

我看小甲鱼教学视频里是定义了一个数组temp然后把数组的整个数组地址赋值给了(*p)=&temp,并不是*(*p),我就是不明白为什么还要在前面多加一个*...

jhanker 发表于 2021-9-15 12:56:51

黄jz 发表于 2021-9-15 12:45
我看小甲鱼教学视频里是定义了一个数组temp然后把数组的整个数组地址赋值给了(*p)=&temp,并不是* ...

他的视频我没看过 在他视屏里 temp的类型是 char* temp还是 char temp

黄jz 发表于 2021-9-15 12:59:14

本帖最后由 黄jz 于 2021-9-15 13:00 编辑

jhanker 发表于 2021-9-15 12:56
他的视频我没看过 在他视屏里 temp的类型是 char* temp还是 char temp
int temp

jhanker 发表于 2021-9-15 13:01:22

黄jz 发表于 2021-9-15 12:59
char temp

所以和你问的问题是不一样的

黄jz 发表于 2021-9-15 13:07:13

本帖最后由 黄jz 于 2021-9-15 13:09 编辑

jhanker 发表于 2021-9-15 13:01
所以和你问的问题是不一样的

他是 int temp,取了(*p)=&temp,我想的是指针数组也是数组,为什么不能直接取数组的总体地址然后赋值给(*p)而是赋值给*(*p)

jhanker 发表于 2021-9-15 13:23:49

黄jz 发表于 2021-9-15 13:07
他是 int temp,取了(*p)=&temp,我想的是指针数组也是数组,为什么不能直接取数组的总体地址 ...

int temp;
int(*p)=&temp;
这样是一边定义一边赋值是可以的
其实是
int(*p);
p=&temp;

jhanker 发表于 2021-9-15 13:24:38

至于书写怎么写是规定的,你要知道其中的含义就行了 !

黄jz 发表于 2021-9-15 13:45:51

jhanker 发表于 2021-9-15 13:23
int temp;
int(*p)=&temp;
这样是一边定义一边赋值是可以的


为什么指针数组就不行...

jhanker 发表于 2021-9-15 14:41:31

黄jz 发表于 2021-9-15 13:45
为什么指针数组就不行...

指针数组也可以啊
int*temp;
int*(*p)=&temp;
这样是一边定义一边赋值是可以的
其实是
int* (*p);
p=&temp;

黄jz 发表于 2021-9-15 15:18:27

jhanker 发表于 2021-9-15 14:41
指针数组也可以啊
int*temp;
int*(*p)=&temp;


我昨天试了一下直接报错...

jhanker 发表于 2021-9-15 15:28:41

黄jz 发表于 2021-9-15 15:18
我昨天试了一下直接报错...

应该是你打错代码了,试试下面的代码:


#include <stdio.h>

int main()
{
int a=0,b=1,c=2,d=3,e=4;
int* temp={&a,&b,&c,&d,&e};
int*(*p)=&temp;
int*(*pa);
pa=&temp;
printf("a的值是:%d\n", *(*p));
printf("e的值是:%d\n", *(*pa));
return 0;
}

黄jz 发表于 2021-9-15 16:41:23

jhanker 发表于 2021-9-15 15:28
应该是你打错代码了,试试下面的代码:

#include <stdio.h>

int main()
{
        char *array={"Fishc","Five","Star","Good","WoW"};
        char (*p)=&array;
        int i,j;
        for(i=0;i<5;i++)
        {
                for(j=0;*(*(*p+i)+j)!='\0';j++)
                {
                        printf("%c",*(*(*p+i)+j));
                }
                printf("\n");
        }
        return 0;
}



下面是错误:
C:\Users\DRD\Desktop\c\未命名41.cpp        In function 'int main()':
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        deprecated conversion from string constant to 'char*' [-Wwrite-strings]
6        16        C:\Users\DRD\Desktop\c\未命名41.cpp        cannot convert 'char* (*)' to 'char (*)' in initialization
10        22        C:\Users\DRD\Desktop\c\未命名41.cpp        invalid type argument of unary '*' (have 'int')
12        27        C:\Users\DRD\Desktop\c\未命名41.cpp        invalid type argument of unary '*' (have 'int')

jhanker 发表于 2021-9-15 16:54:48

你代码写错了

#include <stdio.h>

int main()
{

      char* array={"Fishc","Five","Star","Good","WoW"};
      char* (*p)=&array; //这一句你写错了不是char (*p)=&array;
      int i,j;
      for(i=0;i<5;i++)
      {
                        for(j=0;*(*(*p+i)+j)!='\0';j++)
                        {
                                printf("%c",*(*(*p+i)+j));
                        }
                        printf("\n");
      }
      return 0;

}

黄jz 发表于 2021-9-15 17:26:50

jhanker 发表于 2021-9-15 16:54
你代码写错了

就是为啥要多加一个*号..

jhanker 发表于 2021-9-15 21:24:04

char* array={"Fishc","Five","Star","Good","WoW"}; //这一句有 char*
char* (*p)=&array; //这一句你写错了不是char (*p)=&array;//这一句也一样要求是char*
页: [1]
查看完整版本: 请问这个指针数组赋值给数组指针怎么理解