Это выражение
*pointera[0]
эквивалентно
*( pointera[0] )
и возвращает значение объекта типа char.
Вы можете переписать выражение как
( *pointera )[0]
, но результат для этого конкретного случая будет таким же, потому что pointera[0]
и *pointera
являются эквивалентными выражениями. Вы могли бы даже написать pointera[0][0]
из **pointera
.
Вот демонстрационная программа.
#include <stdio.h>
int main(void)
{
char c = 'A';
char *p = &c;
char **q = &p;
printf( "c = %c\n", *q[0] );
printf( "c = %c\n", ( *q )[0] );
printf( "c = %c\n", q[0][0] );
printf( "c = %c\n", **q );
return 0;
}
Ее вывод
c = A
c = A
c = A
c = A
Однако эти соотношения действительныкогда вы пытаетесь получить доступ к одному объекту, на который указывает указатель.
Когда указатель указывает на указатель, который указывает на первый элемент массива, тогда лучше использовать следующую запись
( *pointera )[i]
, где i
- индекс требуемогоэлемент. Эта запись говорит читателю кода, что второй указатель ( *pointera )
указывает на первый элемент массива.
Поэтому, чтобы сделать вашу функцию secValue
более читабельной, я предлагаю заменить выражение в этом выражении
printf("First value is %c \n",*pointera[0]);
до следующего
printf("First value is %c \n", ( *pointera )[0]);
Что касается этого оператора
scanf(" %c",&pointera[1]);
, то используемое выражение уже недопустимо. Указатель pointera
указывает на один объект (другой указатель), поэтому выражение pointera[1]
указывает за пределы одного объекта. Вы должны написать
scanf(" %c", *pointera + 1 );
или
scanf(" %c", &( *pointera )[1] );
То же самое верно для этого утверждения
scanf(" %c %c",&pointera[2],&*pointera[3]);
Там должно быть либо
scanf(" %c %c", *pointera + 2, *pointera + 3 );
или
scanf(" %c %c",&( *pointera )[2],&( *pointera )[3]);
Кажется, в этом утверждении
*pointera=(char *)realloc(*pointera,3*sizeof(char));
есть опечатка. Вы имеете в виду
*pointera=(char *)realloc(*pointera, 4 * sizeof(char));
^^^
Также лучше использовать промежуточную переменную для перераспределения памяти, поскольку realloc
может возвращать NULL
, а исходный указатель pointera
будет перезаписан NULL
.
Так что функция может выглядеть как
void secValue(char **pointera){
printf("First value is %c \n", ( *pointera )[0]);
printf("Enter 2nd value\n");
scanf(" %c", *pointera + 1 );
printf("Enter 3rd and 4th value\n");
char *tmp = realloc(*pointera, 4 * sizeof(char));
if ( tmp != NULL )
{
*pointera = tmp
scanf(" %c %c",*pointera + 2, *pointera + 3 );
}
}