这是我编码期末考试的练习题。

#include <stdio.h>
#define N 3

// a structure type for storing an array. 
typedef struct
{
    int *ptrData;
    int length;
} ARRAY;

void printArray(ARRAY A)
{
    int i;
    printf("Array Content:\n");
    for (i=0; i<A.length; i++)
    {
        printf("%d\n", A.ptrData[i]);
    }
}

int main()
{
    int x[N]={1, 3, 5};
    ARRAY array1;
    ARRAY array2;
    array1.ptrData=x;
    array1.length=N;
    array2=array1;
    array1.ptrData[0]=10;
    printArray(array1);
    printArray(array2);
    return 0;
}

输出是

Array Content:
10
3
5
Array Content:
10
3
5

我无法理解为什么array2的输出与array1相同。 我了解他们如何获得array1的值但不确定array2的值,因为根据我的理解,在声明array1 = array2后, array1的第一个元素更改为 10 但从输出来看,似乎array2的第一个元素已设置也到 10。

如果想澄清为什么array2的输出与array1相同。

#1楼 票数:3

这是你的结构:

typedef struct {
    int *ptrData;
    int length;
} ARRAY;

在这里,您将结构的一个实例分配给另一个实例:

array2=array1;

这会复制所有字段,但字段ptrData只是指向数字数组实例的指针 这也称为浅拷贝,因为它只创建结构本身的字段的副本,而不是它可能包含的引用对象的副本(与深拷贝相反,不能用 c 原语完成)。 所以数字数组实例没有重复,只有指向它的指针。 因此,该数组只存在一次,并且无论您是通过 struct 实例array1还是array2访问它,都会反映修改。

如果你有一个结构体,情况会有所不同

typedef struct {
    int data[N];
    int length;
} ARRAY;

在这里,确实存在数组内容data两个实例,并且数据将在赋值时被复制

#2楼 票数:2

因为 array1 和 array2 都指向相同的 (x)

您可以通过打印 x 的值来检查这一点

for (i=0; i<N; i++)
{
    printf("%d\n", x[i]);
}

这里 x[0] 的值也将改变

#3楼 票数:1

typedef struct
{
    int *ptrData;
    int length;
} ARRAY;

这里ptrData是一个指向内存地址的指针。

array1.ptrData=x;

此行将array1结构的指针成员指向的内存设置为数组x起始地址。 数组的名称也是一个指针,因此在这里可以毫无错误地完成此分配。

array2=array1;

此行将array1保存的所有信息复制到array2 这意味着array2.ptrData = array1.ptrDataarray2.length = array1.length 然后array2.ptrData指针指向与array1.ptrData指针相同的内存。 您可以使用这两个指针访问相同的内存地址。

  ask by BigDongoBongo translate from so

未解决问题?本站智能推荐:

1回复

这个c代码中数组/指针的输出是什么

请帮我找到给定代码的输出
1回复

C、char**奇怪的输出

这产生了“???”的精彩输出 (字面问号)和诸如此类的随机内容。 我只是想更多地了解指针和字符串类型的东西,如果有人能帮忙,那就太好了,谢谢! 另外:在Linux终端和nano中编写和编译它,如果有任何改变
1回复

想要创建一个2D指针,在C++中存储Nx3值

我已经在下面编写了代码,并且希望使用if-else条件使用它存储一些值。 为了存储值,我创建了两个2-D指针* p和* q。 现在代码似乎可以正常运行,但是我无法打印出存储在指针p和q中的值。 你能帮我吗? 我究竟做错了什么”?
2回复

将指针数组传递给接受二维数组的函数

我在 C 中有以下代码#include <stdio.h> char *gstr[] = { "Hello", "World" }; void func(char str[][8]) { printf("%p\n", (void *)str); printf("%p\n",
1回复

使用与字符数组类似的语法显示字符指针?

因此,在数组中,您可以使用 [i] 从一个索引移动到下一个索引。 我知道你可以通过增加指针的内存地址来做类似的事情: 但是,您可以使用与数组类似的语法(使用 [ ])来遍历指针吗? 我是 C 的新手,所以如果可以的话,为什么,它是如何工作的,正确的语法是什么? 我想它看起来像这样:
5回复

char*究竟定义了什么?如果它定义了一个字符串数组,我如何输出单个元素?

嗨,我得到了上面的代码,它从文本文件中读取一个字符串并将其存储在一个数组中。 现在我想输出数组 string1 的某个元素,但显然 printf 不起作用。 此外,char *string1[20] 究竟定义了什么? 跟指针有关系吗? 谢谢!
1回复

C语言。无法理解指针的输出

我有以下代码。 我期望输出为10 20 20 29 10 999 5 999 29 ,但是,正确的输出似乎是10 20 20 29 999 29 5 999 29 。 区别在于*z和**pp 。 即使我试图绘制图表并逐步分析结果,我也无法理解为什么。 为什么*z和**pp分别是999和29,而不是1
1回复

为什么在将输入提供给指针时无法打印值输出?

我的输出是: 代码中的另一个printf没有打印在输出中。 我试图调试,但它给出了分段错误。 我想给指针赋值并获取数据请任何人告诉我如何在 printf 中将输入的输入作为输出