c - 指向字符串的指针数组(指针的基本类型)
问题描述
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 的指针;指向它们各自字符串的第一个字符,我们如何通过仅交换指针数组中dheeraj和rahul的基地址来交换整个字符串。
解决方案
文字字符串实际上是一个只读字符数组(包括空终止符)。与其他数组一样,它们衰减为指向其第一个元素的指针。您的数组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 *
用于指向它们的指针。
推荐阅读
- typescript - 带有点符号的打字稿深度省略
- babylonjs - 使用 parcel.js 摇树 BabaylonJs
- javascript - 使用 redux 更新 React ApexCharts
- docker - web-api 无法连接到 Docker 作曲家网络中的 sqlserver
- amazon-web-services - 如何运行 AWS Cron 作业,它将运行一整周,但有一个例外(我不应该在上午 9 点到上午 9 点的周六运行)
- google-bigquery - Apache Beam - Bigquery 流式插入显示 RuntimeException:ManagedChannel 分配站点
- c# - 有没有办法将 Authorize 属性与没有身份验证标头的请求一起使用?
- android - Firebase 分析显示每日活跃用户异常
- c# - PHP SQL 从用户名获取日期时间并与今天的日期进行比较
- logstash - 消息的 Logstash grok 模式