2017-01-25 3 views
0

Я пытаюсь решить следующую проблему, но пока не могу добиться успеха:C: Указатель на 2-мерный массив указателей

У меня есть два-diwmensional массив указателей:

int* a[16][128]; 

Теперь я хочу сделать указатель на этот массив таким образом, чтобы я мог использовать арифметику указателя на нем. Таким образом, что-то вроде этого:

ptr = a; 
if(ptr[6][4] == NULL) 
    ptr[6][4] = another_ptr_to_int; 

Я уже пробовал несколько вариантов, но он либо не работает, то на первой линии или на, если условия.

Итак, как это можно решить? Я бы хотел избежать шаблонных классов и т. Д. Код - это критически важная часть встроенного приложения, а память очень ограничена. Таким образом, я бы хотел, чтобы ptr был всего лишь sizeof(int*) байтов.

+1

Вы инициализировали все элементы 'a'? IE a 'int * a [16] [5] = {NULL};' иначе ваш компьютер может быть [спрей, нарисовавший вашу кошку фиолетовым] (http://en.cppreference.com/w/cpp/language/ub) , – George

+0

'auto ptr = a;' должен выполнять работу, поэтому ваш 'ptr' будет иметь правильный тип. – mch

+0

компилятор не знает auto – dspverden

ответ

2

указатель на первый элемент массива (который является то, что вы хотите) может быть объявлена ​​как

int* (*ptr)[128]; 

Указатель на массив сам будет

int* (*ptr)[16][128]; 

и не то, что ты ищешь.

+0

Хорошо. Но каков размер ptr в памяти? sizeof (int *) или 128 * sizeof (int *)? – dspverden

+0

@dspverden Вы можете легко проверить, распечатав 'sizeof (ptr)'. (Это 99,99% уверены, что он будет таким же, как 'sizeof (int *)'.) – molbdnilo

+0

, если бы это было так просто на встроенном устройстве ... – dspverden

1

Thing вы, кажется, хотят:

int* (*ptr)[128] = a; 

Фактический указатель на массив:

int* (*ptr)[16][128] = &a; 
0

Чтобы начать с основ указателя массива для массива 1D, [tutorialspoint] [1] имеет очень легко готовое описание. Из их примера:

#include <stdio.h> 

int main() { 

    /* an array with 5 elements */ 
    double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; 
    double *p; 
    int i; 

    p = balance;         //Here the pointer is assign to the start of the array 

    /* output each array element's value */ 
    printf("Array values using pointer\n"); 

    for (i = 0; i < 5; i++) { 
     printf("*(p + %d) : %f\n", i, *(p + i)); 
    } 

    printf("Array values using balance as address\n"); 

    for (i = 0; i < 5; i++) { 
     printf("*(balance + %d) : %f\n", i, *(balance + i)); // Note the post increment 
    } 

    return 0; 
} 

Есть пара из relavent переполнения стека ответов, которые описывают 2D массивы: How to use pointer expressions to access elements of a two-dimensional array in C?

Pointer-to-pointer dynamic two-dimensional array

how to assign two dimensional array to **pointer ?

Representing a two-dimensional array assignment as a pointer math?

[1]: https://www.tutorialspoint.com/cprogramming/c_pointer_to_an_array.htm