c指针被传递给一个函数
c pointer being passed to a function
int func(int a[]);
int main()
{
int c = 21;
int *b;
b=&c;
printf("%d",b);
func(b);
return 0;
}
int func(int a[]){
printf("\n%d",(a));
printf("\n%d",*(a));
printf("\n%d",(a[0]));
printf("\n%d",(a[1]));
printf("\n%d",(a[2]));
}
这是我试图了解这些指针如何与数组一起工作的东西。
这是输出。
-680548828
-680548828
21
21
-680548828
32767
前两个680548828和后两个21我懂了。简单地打印 a 将是数组 a[] 的第一个元素。 a[0] 就像写 *a。我不明白的是为什么 a[1] 中会有 680548828。 a[1] 是数组中存储指向 21 的指针的元素(a[0])之后的元素?抱歉造成混淆,请帮忙。谢谢。
在你的代码中
printf("%d",b);
当您尝试使用 %d
打印指针时, 调用 undefined behaviour。正确的方法是使用
%p
格式说明符
- 将参数转换为
void *
相同的逻辑也适用于被调用函数,请记住,在大多数情况下(包括这种特定用法),数组名称会衰减为指向第一个元素的指针,基本上会产生指针类型。
也就是说,您正在尝试访问被调用函数中的无效内存。您传递了一个指向 int
的指针,并且在被调用的函数中,您试图通过说 a[1]
、a[2]
等访问内存区域之外的内存。您不能那样做。它再次调用未定义的行为。
int func(int a[]);
int main()
{
int c = 21;
int *b;
b=&c;
printf("%d",b);
func(b);
return 0;
}
int func(int a[]){
printf("\n%d",(a));
printf("\n%d",*(a));
printf("\n%d",(a[0]));
printf("\n%d",(a[1]));
printf("\n%d",(a[2]));
}
这是我试图了解这些指针如何与数组一起工作的东西。 这是输出。
-680548828
-680548828
21
21
-680548828
32767
前两个680548828和后两个21我懂了。简单地打印 a 将是数组 a[] 的第一个元素。 a[0] 就像写 *a。我不明白的是为什么 a[1] 中会有 680548828。 a[1] 是数组中存储指向 21 的指针的元素(a[0])之后的元素?抱歉造成混淆,请帮忙。谢谢。
在你的代码中
printf("%d",b);
当您尝试使用 %d
打印指针时,调用 undefined behaviour。正确的方法是使用
%p
格式说明符- 将参数转换为
void *
相同的逻辑也适用于被调用函数,请记住,在大多数情况下(包括这种特定用法),数组名称会衰减为指向第一个元素的指针,基本上会产生指针类型。
也就是说,您正在尝试访问被调用函数中的无效内存。您传递了一个指向 int
的指针,并且在被调用的函数中,您试图通过说 a[1]
、a[2]
等访问内存区域之外的内存。您不能那样做。它再次调用未定义的行为。