指针数组 是一种结构,其中每个元素代表一个指针,通常指向同一类型。通常用于存储字符串列表 (char *arr[];)。
数组指针 是一个变量,存储整个数组的起始地址(例如,int (*ptr)[10]; 指向一个包含10个int元素的数组)。
示例:
// 指向char的指针数组(字符串数组) char *days[] = {"Sun", "Mon", "Tue"}; // 指向10个整数的数组的指针 int arr[10]; int (*p)[10] = &arr; // 访问: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]
"
char *arr[3];与char (*arr)[3];有什么区别,以及在每种情况下如何正确访问字符串?"
许多人认为这没有区别或只是同义词。
正确答案:
char *arr[3]; — 一个包含3个指向char的指针的数组(通常是字符串数组)。char (*arr)[3]; — 指向一个包含3个char的数组的指针(指向长度为3的单一字符串)。char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z
故事 1
在项目中,创建了一个字符串数组用于菜单,但写为char menu[5][30];,错误地将其作为参数传递给函数,写作char *menu,导致函数仅能处理第一行,其他行扭曲或程序崩溃。
故事 2
尝试创建指向数组的指针数组:int *arr[10]; 通过循环初始化,但实际上存储的是对局部数组的指针,这在访问时导致未定义行为(UB)。
故事 3
在FIFO队列实现中,混淆了在哪里获取整个队列的地址(数组指针)和在哪里获取元素(指向块的指针数组)。因此,指针偏移不正确——数据丢失。