относительно двухмерных массивов - PullRequest
0 голосов
/ 12 апреля 2011

если я создал массив как int marks [4] [2]; тогда имя массива должно дать мне адрес первого элемента, как в случае одномерного массива, но это не так? & также
printf("%d",marks[0]); & printf("%d",marks); дать тот же результат ?????????

Ответы [ 4 ]

2 голосов
/ 12 апреля 2011
printf("%d",marks);

Задание неправильного спецификатора формата приводит к undefined-поведения .marks приводит к указателю на одномерный массив (т. Е. К указателю, указывающему на первый элемент первой строки).

Таким образом, для печати содержимого указателя следует использовать %p.

printf("%p",marks);

И, кажется, вы пытаетесь напечатать значение в местоположении 0*0.Итак -

printf("%d",marks[0][0]);  // [m][n] is the way of accessing 2D array elements.
1 голос
/ 12 апреля 2011

Он ведет себя, как и ожидалось:

#include <stdio.h>

int main(int argC,char* argV[]) 
{

  int marks[4][2]={0};
  printf("%x %x %x\n"
         "%x %x %x\n"
         "%x %x\n",
         marks,marks[0],marks[0][0],
         *marks,&marks,**marks,
         &marks[0],&marks[0][0]);
  return 0;
}

Имеет вывод:

12ff44 12ff44 0
12ff44 12ff44 0
12ff44 12ff44

Все указатели на первый элемент списка (кроме нуля, который равен первый элемент списка).

0 голосов
/ 12 апреля 2011

Когда вы используете %d в формате printf, соответствующий аргумент (после продвижения по умолчанию) ДОЛЖЕН иметь тип int. Поскольку вы нарушили это правило в обоих случаях, все может произойти.

marks имеет тип int[4][2] и уменьшается до int(*)[2], что не int.

marks[0] имеет тип int[2] и уменьшается до int*, что не int.

(Но я все еще удивлен, что фактическая реализация выдаст разные адреса.)

0 голосов
/ 12 апреля 2011

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

Е ( "% й \ п", & а [I] [J]); * +1003 *

Оба оператора печати печатают один и тот же результат, поскольку и метки, и метки [0] указывают на начало первой строки двумерного массива.

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