Язык C, использование вторичных указателей, p, *p, **p

         Использование вторичного указателя - очень сложная проблема. Основная причина в том, что он используется реже. Если вы будете использовать его часто, вы отчетливо почувствуете специфический метод его использования.

char *a[10]={"as","bc","ssasd","asd"};

символ **p=а;

 Тогда значение p, *p, **p:

        В данном коде определяется массив указателей на символы aи инициализируются его элементы. Затем определите указатель указателя символов pи укажите его на массив a.

  • p: это указатель символьного указателя, указывающий на aадрес первого элемента массива символьных указателей, a[0]т.е. Таким образом, pуказывая на строку «как».
  • *p: Разыменовав p, вы получите pзначение по адресу, на который указывает , то a[0]есть строку «as».
  • **p: Это указатель на указатель символа. Разыменовывая *p, вы получаете *pзначение по адресу, на который указывает , т. е. a[0], а затем разыменовывая его, вы получаете первый символ 'a строки "as" '.

        Таким образом, pуказание на строку «as» *pтакже указывает на строку «as», но **pна первый символ «a» строки «as».

        Но смещение p — это указатель (8 бит) в массиве указателей (64-битный компилятор) , а смещение *p — всего один байт (сравнение — это следующая операция, конкретное смещение *p см. в разделе «Типы данных»). .

/*===============================================
*   文件名称:Func_Wordstr.c
*   创 建 者:WM
*   创建日期:2023年08月14日
*   描    述:一堆字符串中求纯字母字符串
================================================*/
#include <stdio.h>
int Func_word(char **);

int main(int argc, char *argv[])
{ 
   char  *arr [10]={"ashdjas","as./.d","sasd[]","wor ld","[]hello","as"};
   printf("%d\n",Func_word(arr));
   return 0;
} 
int Func_word(char **str)
{
   int i=0;
    while (*str!=NULL)
    {
      while(**str)
      {
        if ((('a'<=**str&&**str<='z')||('A'<=**str&&**str<='Z')))
        {
               if(*(*str+1)=='\0')
               {
                  i++;
                  break;
               }
        }
        else
        {
              break;
        }
        (*str)++; //指向内层的数据的指针开始偏移一个字节的单位。       
      } 
      str++;//这个是指向数组内指针的指针开始偏移,偏移一个地址位。
    }
   return i; 
}

Guess you like

Origin blog.csdn.net/qq_52119661/article/details/132286753