sizeof (pi) возвращает размер (char *), который является типом pi (указатель, вероятно, два, четыре или восемь байтов). sizeof (char) вернет 1.
Однако еще одна вещь, которую нужно понять, это то, что всякий раз, когда вы увеличиваете указатель на число (например, pi + = sizeof (char); pi ++ и т. Д.), Вы все равно увеличиваете указатель на базовый размер. Итак:
int *ipointer = &int_array[0];
ipointer += 2;
будет фактически увеличивать ipointer в 2 раз по размеру int .
Еще одна вещь, которую вы, похоже, делаете неправильно: наведите пи на первый аргумент, а затем переберите все аргументы. Если вы хотите перебрать аргументы, попробуйте что-то вроде этого:
for (i = 1; i < argc; i++) {
pi = argv[i];
// ... do something with pi
}