在C中
int *arr[]
显然是一个指向int的指针数组,但对于
char *arr[]
是指向字符串的指针数组,这是怎么回事?那么编译器是如何区分这两者的呢?我读了这个问题-
Char* array of chars, but int* not array of ints?
但是,对于指向字符串的指针数组,我们讨论的是大内存,编译器将不得不为字符串和指针数组单独创建内存,编译器是否以某种方式单独处理变量?
发布于 2021-05-06 14:31:48
int*
和char*
的行为相同,只是后者被视为C字符串,而前者不被视为C字符串。一个C字符串只是一个指向char
的指针,如“一个或多个字符取决于目标分配的内存大小”。
int *arr[] // Array of pointers to (at least one) int
char *arr[] // Array of pointers to (at least one) char (a.k.a. a "C string")
编译器没有特别区分,但所有默认的str
-family函数只适用于char*
。按照传统和惯例,char*
是C字符串的定义方式。它很可能是在不同环境下的int*
,或者甚至是一些完全不同的东西,比如一些操作系统如何使用UTF-16而不是8位编码。
在这两种情况下,int* x[]
和char* y[]
的行为完全相同。
发布于 2021-05-06 14:31:36
不,编译器一般不会区分它们。
考虑一下声明
int a[] = { 1, 2, 3 };
int * pa[] = { a, a + 1, a + 2 };
和
char s[] = { '1', '2', '3' };
char * ps[] = { s, s + 1, s + 2 };
正如你所看到的,这没有主要的区别。
这是一个演示程序。
#include <stdio.h>
int main(void)
{
int a[] = { 1, 2, 3 };
int * pa[] = { a, a + 1, a + 2 };
for ( size_t i = 0; i < sizeof( pa ) / sizeof( *pa ); i++ )
{
printf( "%d ", *pa[i] );
}
putchar( '\n' );
char s[] = { '1', '2', '3' };
char * ps[] = { s, s + 1, s + 2 };
for ( size_t i = 0; i < sizeof( ps ) / sizeof( *ps ); i++ )
{
printf( "%c ", *ps[i] );
}
putchar( '\n' );
return 0;
}
程序输出为
1 2 3
1 2 3
唯一的区别是,标准声明了字符串函数,这些函数需要一个指向字符串的第一个元素的char *
类型的参数,而特别是对于int *
类型,这种函数是不存在的。
因此,一些输出函数被特别设计为当其参数的类型为char *
时输出字符串,因为字符串的标记值为'\0'
,这与元素类型为int
的数组不同。
发布于 2021-05-06 14:39:31
C中的“数组”本质上是指针的包装器--它们做have differences,但是为了这个问题的缘故,你可以把它们看作是指向其中第一个元素的指针。
其次,C中的指针和数组可以下标-也就是说,您可以使用方括号([]
)来执行对它们的类似数组的访问。在引擎盖下面,这只是一些指针算法,用来获得所需的元素。
这意味着type* var
和type var[]
都可以是type
的“数组”,但type* name
也可以只是一个指向某些type
类型数据的普通老式指针-在没有上下文的情况下查看它,您实际上无法分辨。
因此,int *arr[]
要么是int
“数组”的数组,要么是指向单个int
的指针的数组
char *arr[]
要么是char
“数组”的数组,要么是指向单个char
的指针的数组。
最后--C编译器并不关心它们被提供了什么,你在语法上正确地使用了它们--你可以将一个int*
作为一个不是一个数组的数组来访问,并获得垃圾数据,但是C编译器的工作并不是告诉你不要这样做。
https://stackoverflow.com/questions/67420149
复制