难道指针数组不能指向多个字符串吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了难道指针数组不能指向多个字符串吗?相关的知识,希望对你有一定的参考价值。

#include "stdio.h"
void main()

char *p[4];
int i;
strcpy(*p[0]," You ");
strcpy(*p[1]," are ");
strcpy(*p[2]," the ");
strcpy(*p[3]," one !");
for(i=0;i<4;i++)
printf("%s",*p[i]);
printf("\n");

我想检验一下自己对指针数组的理解,于是编了这个程序。
但是却是错误的,难道指针数组不能指向多个字符串吗?
求助于各位前辈,解释一下!
感激ing!

char *p[4];
int i;
strcpy(*p[0]," You ");
strcpy(*p[1]," are ");
strcpy(*p[2]," the ");
strcpy(*p[3]," one !");
strcpy()第一个参数是一个char*,*p[0]是char*类型么?显然不是,p[0]才是,下面都是一样的问题
第二,p[o]~p[4],都只是一个指针,并没有给它们分配 内存,所以直接strcpy也是不对的
参考技术A 要这样才能;
p[0]=" You ";
p[1]=" are ";
p[2]=" the ";
p[3]=" one !";
你犯了两个错误,多了一个 *号
strcpy复制到并没有分配空间的数组中;
参考技术B 你分配了四个指针变量,它们是用来存放地址的。但是字符串内容,比如"You""are""the""one",需要实际的存储空间存放,你没有分配空间存放这些内容。
很奇怪,你的程序没有core掉?
参考技术C 肯定是错的啊,你的数组是字符指针类型的,每一个元素是指向一个字符变量的指针,而你的you are the one 这些都是字符串常量,所以肯定是错的呀 参考技术D char *p[4]="you ","are","the","one";不能strcpy

数组变量是指向数组第一个元素的指针吗? [复制]

【中文标题】数组变量是指向数组第一个元素的指针吗? [复制]【英文标题】:Is the array variable a pointer, which points to the first element of an array? [duplicate] 【发布时间】:2022-01-12 18:39:36 【问题描述】:

我在互联网上读到这个数组变量指向数组的第一个元素。代码示例如下:

#include <stdio.h>
int main()

    int i,a[10];
    for ( i = 0; i <= 9; ++i )
    
        printf ("The address of the array element %d is = %p\n",i+1, &a[i]);
    
    
    printf ("The address of the &a is = %p\n", &a); 
    
    printf ("The address of &a[0] is = %p\n", &a[0] );
    
    printf ("The address of a is = %p", a);
    
    return 0;

根据网上资料:数组变量a和数组元素a[0]的地址相同,因为数组变量名a指向数组的第一个元素,即a[0]。我的问题是:

    数组变量 a 是指针吗,因为它指向数组的第一个元素?

    如果数组变量a是一个指针,那么指针a和变量a[0]的地址不应该是(a 指向的指针)不同? (这里我们得到相同的地址)

    如果数组变量a不是指针,那下面的代码该如何解释呢?

a[0] = *a
a[1] = *a+1
a[2] = *a+2
a[3] = *a+3
a[4] = *a+4
a[5] = *a+5

我想这是一个很长的问题,但请告诉我答案,因为我已经为此绞尽脑汁,现在我想用头撞墙。我也是堆栈溢出的新手。

【问题讨论】:

数组不是指针,但在某些情况下它衰减为指针。至于您的示例,它只是定义a[x]*(a+x) 相同的语法糖,而不管a 是数组还是指针。此外,x[a] 可以写成x 是整数,a 是数组或指针,与a[x] 相同。 好问题,但以前有人问过。这是一个可能的重复:Is an array name a pointer? 基本的C问题在这里已经回答了很多次了。使用搜索栏 - 它会节省你写这个问题的时间 数组和指针之间的关系是所有 C 语言中最基本和最重要的学习内容之一。不幸的是,它也可能是最令人困惑和最难学习的内容之一。像“一个数组是指向它的第一个元素的指针”这样的陈述,虽然是善意的并且很受欢迎,但不幸的是,在实际教育新学习者方面完全是灾难性的。无论您“在互联网上阅读”是什么页面,关闭该窗口并删除该链接并尝试忘记您在那里阅读的内容。 改为阅读:数组就是数组,指针就是指针。但是当你在表达式中使用数组时,比如f(array)x = array + 1,你需要数组的值,你得到的不是整个数组,你得到的是指向数组第一个元素的指针。那个新指针不是“数组”;当您尝试获取数组的值时,该新指针会喷出。 【参考方案1】:

数组不是指针。确保运行这个简单的程序

#include <stdio.h>

int main( void )

    int a[10];

    printf( "sizeof( a ) = %zu\n", sizeof( a ) );
    printf( "sizeof( &a[0] ) = %zu\n", sizeof( &a[0] ) );

它的输出可能看起来像

sizeof( a ) = 40
sizeof( &a[0] ) = 8

但是,在表达式中使用的数组指示符确实会隐式转换为指向其第一个元素的指针。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

至于你的问题

如果数组变量a不是指针那么我们该如何解释 代码如下?

a[0] = *a
a[1] = *a+1
a[2] = *a+2
a[3] = *a+3
a[4] = *a+4
a[5] = *a+5

然后在阅读了 C 标准中提供的引用之后,很明显这个表达式 *a 中的数组指示符 a 被转换为指向其第一个元素的指针。那就是您实际上拥有*( &amp;a[0] ) 或只是a[0]。而上面的记录等价于

a[0] = a[0]
a[1] = a[0]+1
a[2] = a[0]+2
a[3] = a[0]+3
a[4] = a[0]+4
a[5] = a[0]+5

关于地址的问题,表达式&amp;a&amp;a[0] 具有相同的值,因为它是数组占用的第一个字节的地址值。但是表达式的类型是不同的。表达式&amp;a 的类型为int ( * )[10],表达式&amp;a[0] 的类型为int *

【讨论】:

从问题来看,OP刚刚开始学习C。C标准使用的语言肯定只会造成更多的混乱。顺便说一句,它是最常见的重复项之一 这不是 OP 所问的。

以上是关于难道指针数组不能指向多个字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

数组指针是二级指针吗?请解释一下!谢谢!

第二次作业

数组名相当于一个指针,哪数组指针char *p[],不就变成一个二级指针?

二维数组名不能赋值给二级指针- -

c++二维数组和二级指针

qt 中能不能用一个指向数组的指针对另一个数组赋值