Возникают проблемы с пониманием вывода кода при работе с указателями в C - PullRequest
2 голосов
/ 21 февраля 2020

Это практический вопрос из моего финала по кодированию.

#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 был изменен на 10 после объявления array1 = array2, но из вывода это выглядит как * Для первого элемента 1013 * также было установлено значение 10.

Если вы хотите пояснить, почему вывод array2 совпадает с array1.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2020

Это ваша структура:

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

и здесь вы назначаете один экземпляр структуры другому:

array2=array1;

Это копирует все поля, кроме поля ptrData является только указателем на экземпляр массива чисел. Это также называется мелкой копией , потому что он создает копии только полей самой структуры, но не ссылающихся объектов, которые она может содержать (в отличие от глубокой копии, которую нельзя сделать с помощью c примитивы). Так что экземпляр массива чисел не дублируется, только указатель на него. Как следствие, массив существует только один раз, и модификация отражается независимо от того, доступен ли он через экземпляр структуры array1 или array2.

Ситуация будет иной, если у вас есть структура

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

Здесь действительно существует два экземпляра содержимого массива data, и данные будут скопированы при назначении.

2 голосов
/ 21 февраля 2020

Поскольку и array1, и array2 указывают на одно и то же (x)

Вы можете проверить это, напечатав значения x на

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

Здесь также значение x [0] будет измененный

1 голос
/ 21 февраля 2020
typedef struct
{
    int *ptrData;
    int length;
} ARRAY;

Здесь ptrData - указатель, который указывает адрес памяти.

array1.ptrData=x;

Эта строка устанавливает память, на которую указывает указатель члена array1 struct, в качестве начального адреса массива x. Имя массива также является указателем, поэтому здесь это назначение может быть выполнено без ошибок.

array2=array1;

Эта строка копирует всю информацию, хранящуюся в array1 в array2. Это означает array2.ptrData = array1.ptrData и array2.length = array1.length. Затем указатель array2.ptrData указывает ту же память с указателем array1.ptrData. Вы можете получить доступ к одному и тому же адресу памяти, используя эти два указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...