Постепенное увеличение C указатели

Вы должны создать эмулятор хранилища данных.

Пожалуйста, следуйте инструкциям ниже.

gcloud components install cloud-datastore-emulator

gcloud beta emulators datastore start

oiutput: [хранилище данных] Dev App Server запущен.

подробнее: https://cloud.google.com/datastore/docs/tools/datastore-emulator

6
задан Robert Gamble 23 November 2008 в 16:35
поделиться

3 ответа

sizeof (символ), как гарантируют, будет 1, но sizeof (символ*) не.

Тем не менее, Ваша функция только работает случайно.

Например, попытайтесь назвать его со следующими параметрами:

abc defg

Это уступит:

2 args.
input: a, c,

который является прост неправильный. Проблема - Вы, увеличивают указатель на элемент 1 из argv вместо указателя на argv.

Попробуйте это:

#include <stdio.h>

int main(int argc, char * argv[]){
   char **pi;
   int i;

   pi = argv + 1;
   printf("%d args.\n",argc-1);
   printf("input: ");
   for(i=0;i<argc-1;i++){
      printf("%c, ",**pi);
      pi++;
   }
   printf("\n");
   return 0;
}

Это распечатает первый символ каждого аргумента:

2 args.
input: a, d,
20
ответ дан 8 December 2019 в 03:55
поделиться

Если у Вас есть указатель ptr из типа T* и Вы добавляете N, затем указатель будет усовершенствован N * sizeof (*ptr) или эквивалентный N * sizeof (T) байты. Вы просто забыли разыменовывать pi. Таким образом, с чем Вы добрались sizeof (pi) был sizeof char*, но не sizeof a char. Ваша строка была эквивалентна pi+=sizeof(char*)/2; Указатели на Вашей платформе составляют большие 4 байта. Таким образом в действительности Вы сделали pi+=2;. Записать pi+=2 если Вы хотите увеличить 2 раза. Отметьте это char имеет sizeof 1 по определению. Вы не должны делать sizeof (char), это всегда 1.

4
ответ дан 8 December 2019 в 03:55
поделиться

sizeof (пи) возвращает размер (символ*), который является типом пи (указатель, вероятно, два, четыре, или восемь байтов). sizeof (символ) возвратится 1.

Однако другая вещь понять является этим каждый раз, когда Вы увеличиваете указатель числом (например: пи + = sizeof (символ); пи ++; и т.д.), Вы увеличиваете указатель основным размером так или иначе. Так:

int *ipointer = &int_array[0];
ipointer += 2;

на самом деле увеличит ipointer к 2 разам sizeof интервал.

Другая вещь, которую Вы, кажется, делаете неправильно, указывает на пи на первый аргумент и затем цикличное выполнение через все аргументы. Если Вы хотите циклично выполниться через аргументы, попробуйте что-то вроде этого:

for (i = 1; i < argc; i++) {
    pi = argv[i];
    // ... do something with pi
}
3
ответ дан 8 December 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: