Использование вторичного указателя - очень сложная проблема. Основная причина в том, что он используется реже. Если вы будете использовать его часто, вы отчетливо почувствуете специфический метод его использования.
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;
}