首页 > 解决方案 > 指向字符串的指针数组(指针的基本类型)

问题描述

int main(){
int i;
char *names[]={"pankaj",
               "anshul",
               "dheeraj",
               "rahul"
               };
for(i=0;i<4;i++)
    printf("\n%u",names[i]);}

当我对此进行编码时,我发现所有字符串都以连续的方式排列。例如。如果names[0]=436,则names[1]=443,names[2]=450,names[3]=458,因此所有字符串都以连续方式分配了内存,其中\0作为字符。但是字符串可以在任何地方分配内存,并且它们的基地址存储在指向这些字符串的指针数组中。不应该是这样吗?此外,声明的数组中这些指针的基本类型是什么?它们是指向 char的指针还是指向字符串的指针。**就像这些 **char(*p)[6]类型的指针数组或char *p类型的指针数组。我们可以使用这个名称数组来处理整个字符串,例如:

int main()
{
char *names[]={"pankaj",
               "anshul",
               "dheeraj",
               "rahul"
               };
char *temp;
printf("Original:%s%s\n",names[2]names[3]);
temp=names[2];
names[2]=names[3];
names[3]=temp;
printf("New:%s%s",names[2],names[3]);
return 0;
}

在这种情况下,我可以通过交换指针数组字符串的基地址来反转 dheeraj 和 rahul(作为一个整体)字符串位置通过它看起来指针是指向字符串类型的指针,即指针指向整个字符串,而不是仅指向字符串的第一个字符。因此,如果它们不是指向字符串的指针,而只是指向 char 的指针;指向它们各自字符串的第一个字符,我们如何通过仅交换指针数组中dheerajrahul的基地址来交换整个字符串。

标签: carraysstringpointers

解决方案


文字字符串实际上是一个只读字符数组(包括空终止符)。与其他数组一样,它们衰减为指向其第一个元素的指针。您的数组names是一个指针数组,每个指针都初始化为指向文字字符串的第一个元素(第一个字符)的指针。

当你交换 的元素时names,你只交换指针。

"%p"您可以通过使用格式说明符打印来轻松检查指针本身:

printf("names[2] = %p, names[3] = %p\n", (void *) names[2], (void *) names[3]);

如果你在交换前后都这样做,你会看到指针在你的数组中被交换了。文字字符串本身的内容仍然是相同的。

在指针交换之前,数组看起来像这样:

+----------+
| 姓名[0] | ----->“pankaj”
+----------+
| 姓名[1] | ----->“安舒尔”
+----------+
| 姓名[2] | ----->“dheeraj”
+----------+
| 姓名[3] | ----->“拉胡尔”
+----------+

指针交换后,数组如下所示:

+----------+
| 姓名[0] | ----->“pankaj”
+----------+
| 姓名[1] | ----->“安舒尔”
+----------+
| 姓名[2] | -\ /-> “dheeraj”
+----------+ x
| 姓名[3] | -/ \->“拉胡尔”
+----------+

字符串本身的位置仍然相同。只有数组的内容发生了names变化。


作为一个小旁注,由于 C 中的文字字符串是只读的,因此您应该真正将它们视为常量并const char *用于指向它们的指针。


推荐阅读