如何在C中使用指针类型?
我最近在研究指针和数组。 假设我初始化一个数组,如如何在C中使用指针类型?,c,arrays,pointers,C,Arrays,Pointers,我最近在研究指针和数组。 假设我初始化一个数组,如 int a[4]={6,2,3,4}; 现在读了很多之后,我明白了 1) a和&a将指向相同的位置。但它们不是指向相同的类型 2) a指向数组的第一个元素,它是一个整数值,因此a的类型是int* 3) &a指向整个数组(即大小为4的整数数组),因此类型为int(*)[] 现在我真正不明白的是如何使用这些类型 例如: 代码1: #包括 无效foo(内部(*arr)[4],内部n) { int i; for(i=0;i代码2是无效的C,因为数组
int a[4]={6,2,3,4};
现在读了很多之后,我明白了
1) a
和&a
将指向相同的位置。但它们不是指向相同的类型
2) a
指向数组的第一个元素,它是一个整数值,因此a的类型是int*
3) &a
指向整个数组(即大小为4的整数数组),因此类型为int(*)[]
现在我真正不明白的是如何使用这些类型
例如:
代码1:
#包括
无效foo(内部(*arr)[4],内部n)
{
int i;
for(i=0;i代码2是无效的C,因为数组指针和指向int
的指针之间的转换不是有效的指针转换-它们是不兼容的类型。如果它起作用,那是因为编译器的一些非标准扩展,或者可能是因为您“运气好”
请注意,在现代C语言中,将数组传递给函数的最佳方法是:
void foo(int n, int arr[n])
{
for(int i=0;i<n;i++)
printf("%d ",arr[i]);
printf("\n");
}
void foo(int n,int arr[n])
{
对于(int i=0;i而言,将数组传递给函数的最佳方式是指针和元素数
注意:您可以将arr
作为arr
或&arr[0]
传递到函数中;两者解析到相同的地址
#include<stdio.h>
void foo(int *arr,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",arr[i]);
printf("\n");
}
int main()
{
int arr[4]={6,2,3,4};
foo(arr,4);
return 0;
}
#包括
无效foo(内部*arr,内部n)
{
int i;
对于(i=0;&a
的类型是int(*)[4]
,而不是int(*)[]
我打赌编译器会给你一个关于代码2的警告,关于不兼容的指针类型…你可能想看看这个问题(我发布了)答案就在这里。虽然你的问题不止这些。因为它试图在没有强制转换的情况下转换指针。你的编译器至少会发出警告。代码2是非法代码,你的编译器允许它在默认模式下运行,因为否则程序依赖这种非法代码的人会感到恼火。在我看来,配置我要报告编译器errors@texasbruce它“有效”,因为在大多数实现中,对int(*)[]
的取消引用是NOP
。与通常的void foo(int arr[],int n)相比,使用它有什么好处
?@a3f优点是,好的编译器或静态分析器在您尝试向函数传递除大小为n
的数组以外的任何内容时,都可能发现类型不一致。事实上,如果您像第一个示例中那样使用数组指针,则标准会保证您在传递数组时始终获得编译器消息大小错误。您还可以获得自文档化代码-任何查看函数的人都可以清楚地看到,n
的目的是表示数组大小。
void foo(int n, int arr[n])
{
for(int i=0;i<n;i++)
printf("%d ",arr[i]);
printf("\n");
}
#include<stdio.h>
void foo(int *arr,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",arr[i]);
printf("\n");
}
int main()
{
int arr[4]={6,2,3,4};
foo(arr,4);
return 0;
}