c - 指向数组的指针存在的原因是什么?
问题描述
以下代码
#include <stdio.h>
char * arr[]={"my","array"};
main()
{
printf("%p %p\n",arr, &arr);
char *(*arr_ptr)[2];
arr_ptr = &arr;
arr_ptr = arr;
}
编译时出现警告
2.c:在函数'main'中:2.c:15:10:警告:来自不兼容指针类型的赋值[默认启用] arr_ptr = arr;
但是,在运行时,编译后的程序会打印出两个相同的数字。
结论是存在一种不同的类型,即“指向数组的指针”,它正好指向数组的第一个元素。
我的问题是:这种指针类型存在的原因是什么,仅仅是arr
作为指向数组的指针还不够吗?
解决方案
拥有指向数组的指针的原因与使用类型的原因相同:
- 它有助于减少错误。如果变量被声明为指向数组的指针,并且您尝试为其分配不同类型的指针,则编译器可以在编译代码时警告您,而不是让您的程序在执行时做错事。这与我们将指针与指向的指针
int
分开的原因相同char
。这甚至是我们int
分开的原因char
——为所有变量提供类型有助于确保它们被用于它们的预期用途。 - 它提供了便利。当您有一个数组数组并想要使用特定行时,您可能有一个指向
A
其中一行的指针(它是一个数组)。然后A+1
是下一行,而不是该行中的下一个元素,并且A-2
是后两行。因此,指向数组的指针可用于将数组作为对象处理,编译器将为您跟踪算术运算,因此您不必使用A-2*NumberOfColumns
返回两行来计算有多少元素。
推荐阅读
- ios - Flutter Tap Gestures 不适用于 UiKitView 和 MapBox
- python - 如何在python列表理解中实现代码
- python - Fuzzywuzzy 返回仅在 Pycharm 中未定义的“比率”
- javascript - 使用 React 和 Axios 从 Express API 下载文件
- .htaccess - 创建一个人造域
- java - 如何在处理中绘制指向鼠标的线
- android - 无法更改从 react-native-paper 导入的按钮的背景颜色
- performance - 在从 s3 到 vertica 的分隔文件上加载 parquet 文件时 Vertica 性能下降
- powershell - Powershell 脚本 - 为文本文件中给出的所有 URI 替换 FilePath
- r - 将多个字符列映射到数值的最快方法