Я хочу распечатать данные массива с помощью указателей, поэтому я пытаюсь сохранить адрес массива в указателе. Но указатель не печатает данные. Позже я также напечатаю второй массив, поэтому объявлены некоторые дополнительные переменные.
Выход:
Код
//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]);
}
}
Вам нужен адрес p1=&Arr1;
также для печати используйте printf("Arr[%d] is %d\t", i, (*p1)[i]);
и printf("\nAddress of %d th array is %p\n", i, *p1+i);
Указатель 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 Аргумент спецификатора преобразования p должен быть указателем типа void *.
Arr1
ЭТО адрес массива!printf("Arr[%d] is %d\t", i, *(Arr1+i))
работает