Печать массива 1D с использованием указателя в C

Я хочу распечатать данные массива с помощью указателей, поэтому я пытаюсь сохранить адрес массива в указателе. Но указатель не печатает данные. Позже я также напечатаю второй массив, поэтому объявлены некоторые дополнительные переменные.

Выход: Печать массива 1D с использованием указателя в C

Код

//print 1D array and 2D array
#include<stdio.h>
#include<stdlib.h>
int Arr1[10];
int Arr2[10][10];
int i, j, n1, n2;
int (*p1)[10];
int (*p2)[10][10];

int main()
{
    printf("For the 1D Array: \n");
    printf("Enter the number of elements you want to add: ");
    scanf("%d", &n1);

    printf("Enter the data for the elements:\n");
    for(i=0;i<n1;i++)
    {
        scanf("%d", &Arr1[i]);
    }
    printf("Displaying Array:\n");
    for(i=0;i<n1;i++)
    {
        printf("%d\t", Arr1[i]);
    }
    
    printf("\nDisplaying using pointer: \n");
    p1=Arr1;
    printf("1D Array is: \n");
    for(i=0;i<n1;i++)
    {
        printf("Arr[%d] is %d\t", i, *(p1[i]));
        printf("\nAddress of %d th array is %u\n", i, p1[i]);
    }

}
Arr1 ЭТО адрес массива! printf("Arr[%d] is %d\t", i, *(Arr1+i)) работает
chrslg 26.11.2022 12:11

Вам нужен адрес p1=&Arr1; также для печати используйте printf("Arr[%d] is %d\t", i, (*p1)[i]); и printf("\nAddress of %d th array is %p\n", i, *p1+i);

QuentinUK 26.11.2022 12:46
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Указатель p1 объявлен как

int (*p1)[10];

В этом операторе присваивания

p1=Arr1;

указатель присваивается выражением типа int * из-за неявного преобразования указателя массива в указатель на его первый элемент типа int *.

Типы указателей операндов несовместимы. Поэтому компилятор должен выдать сообщение.

Вы можете либо написать

int (*p1)[10];

//...

p1 = &Arr1;
printf("1D Array is: \n");
for(i=0;i<n1;i++)
{
    printf("Arr[%d] is %d\t", i, ( *p1 )[i] );
    printf("\nAddress of %d th array is %p\n", i,( void * ) ( *p1 + i ) );
}

Выражение с оператором нижнего индекса

( *p1 )[i]

эквивалентно

*( *p1 + i )

Или вы могли бы написать

int *p1;

//...

p1 = Arr1;
printf("1D Array is: \n");
for(i=0;i<n1;i++)
{
    printf("Arr[%d] is %d\t", i, p1[i]);
    printf("\nAddress of %d th array is %p\n", i,( void * ) ( p1 + i));
}

Я предполагаю, что во втором вызове printf вы хотите вывести адрес каждого элемента массива..

Ладно, я вижу ошибку в несовместимости типов указателей. Да, я хотел напечатать адрес каждого элемента в массиве. Какова цель использования ( void * )?

L127Bangtanned 27.11.2022 06:35

@ L127Bangtanned Аргумент спецификатора преобразования p должен быть указателем типа void *.

Vlad from Moscow 27.11.2022 10:31

Другие вопросы по теме