приращение указателей в c - PullRequest
       0

приращение указателей в c

1 голос
/ 25 августа 2011
#include<stdio.h>
int main()
{
   static char *s[]={"black","white","pink","violet"};
   char **ptr[]={s+3,s+2,s+1,s},***p;
   char a[]={"DEAD"};
   p=ptr;
   ++p;
   printf("%c\n",a[0]);
   printf("%s\n",*s); //black 
   printf("%s\n",*s+1); //lack
   //printf("%s\n",s+1);
   printf("%s\n",s[0]);//black   
   printf("%s\n",s[1]);//white
   printf("%s\n",s[2]);//pink
   printf("%s\n",s[1]);//violet
   printf("%s\n",s[1]+1);//hite
   printf("%s\n",s[1]+6);//pink
   printf("%s\n",**p+1); // how does this prints ink
   return 0;
}

выход:

D черный недостаток черный белый розовый белый белый розовые чернила

пожалуйста, помогите понять

Ответы [ 4 ]

4 голосов
/ 25 августа 2011

Итак, p - указатель на указатель на строку, которая в основном является указателем на символ.

p сам указывает на первый элемент массива ptr;после p++ он указывает на второй, то есть s + 2.

s + 2 указывает на третий элемент в массиве s, который "розовый"

это дваУровни разыменования выполняются **p

сейчас, **p указывает на первый символ «розовый», таким образом **p+1 указывает на «i»

сейчас, printf принимаетуказатель на i и печатает все до следующего нулевого байта, в результате чего на вашей консоли печатаются «чернила».

2 голосов
/ 25 августа 2011

Полагаю, у вас нет проблем со строками, которые я непосредственно не скопировал

printf("%s\n",*s+1); //lack

*s+1 - это то же самое, что (*s) + 1

printf("%s\n",s[1]+6);//pink

s[1]+6 - этотакой же как (s[1]) + 6.s[1] имеет тип char*, поэтому s[1]+6 указывает 6 символов вправо. Но это незаконно, : s[1] указывает только на 6 допустимых символов.Вам просто (неудачно) повезло, что ваша программа не вылетела.

printf("%s\n",**p+1); // how does this prints ink

примерно то же самое происходит с **p+1:)

2 голосов
/ 25 августа 2011

Вы должны понимать указатели.

s[0] точно так же, как *s.

Если у вас есть s[0]+1, он указывает на один символ дальше, чем s[0].

s[1] - это то же самое, что и *(s+1), но оно полностью отличается от *s+1, что совпадает с s[0]+1.

Вы должны рисовать стрелки на доске.

2 голосов
/ 25 августа 2011
p = ptr;
++p; /* p now points to the second element of ptr "s+2" */
/* s+2 points to the third element of s "pink" */
/* **p+1 will point to the second character of "pink", thus "ink"; essentially **(s+2)+1 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...