Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用指针类型?_C_Arrays_Pointers - Fatal编程技术网

如何在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;
}