注册 登录
编程论坛 C语言论坛

指针,这里不太懂,有哪位大佬说下吗?

lan797597 发布于 2020-07-03 10:19, 4932 次点击
#include <stdio.h>

void f(int * pArr, int len)

int main(void)
{
    int a[5]={1, 2, 3, 4, 5};
    int b[6]={-1, -2, -3, 4, 5, -6};
    int c[100]={1, 99, 22, 33};

    f(a,5);
   
    return 0;
}

f(a,5) a  为什么是int * 类型的?
22 回复
#2
lin51616782020-07-03 10:20
类型转换
#3
吹水佬2020-07-03 11:19
将数组名当指针来表达了
严谨的表达:f(&a[0],5)
#4
lin51616782020-07-03 11:23
以下是引用吹水佬在2020-7-3 11:19:21的发言:

将数组名当指针来表达了
严谨的表达:f(&a[0],5)

数组名a在这里会隐式转换为指针
都是严谨的表达
#5
fulltimelink2020-07-03 13:58
cppreference上有个array-to-pointer的说明

Array-to-pointer decay
There is an implicit conversion from lvalues and rvalues of array type to rvalues of pointer type: it constructs a pointer to the first element of an array. This conversion is used whenever arrays appear in context where arrays are not expected, but pointers are:
程序代码:

void g(int (&a)[3])
{
    std::cout << a[0] << '\n';
}

 
void f(int* p)
{
    std::cout << *p << '\n';
}

程序代码:


    int a[3] = {1, 2, 3};
    int* p = a;
    ...
    // where arrays are acceptable, but pointers aren't, only arrays may be used
    g(a); // okay: function takes an array by reference
   
//  g(p); // error
    ...
    // where pointers are acceptable, but arrays aren't, both may be used:
    f(a); // okay: function takes a pointer
    f(p); // okay: function takes a pointer
#6
吹水佬2020-07-03 14:43
以下是引用lin5161678在2020-7-3 11:23:51的发言:


数组名a在这里会隐式转换为指针
都是严谨的表达

所谓的“隐式转换”不是语言表达方式,也许可以说是某些编译器的行为。
如下的表达不可以说都是一样的吧?
void f(int a[], int len)
void f(int &a, int len)
void f(int *a, int len)
#7
lin51616782020-07-03 14:45
以下是引用吹水佬在2020-7-3 14:43:49的发言:


所谓的“隐式转换”不是语言表达方式,也许可以说是某些编译器的行为。
如下的表达不可以说都是一样的吧?
void f(int a[], int len)
void f(int &a, int len)
void f(int *a, int len)

1 3 完全一样
并且和类型转换没有关系
是函数原型作用域的特殊要求

2是另一回事
#8
吹水佬2020-07-03 14:56
个人觉得,C语言的表达方式本身就不是很严谨。
编程不但与机器交流,也与人交流,如果表达不严谨,就会出现象楼主“这里不太懂”的情况。
#9
lin51616782020-07-03 14:59
以下是引用吹水佬在2020-7-3 14:56:06的发言:

个人觉得,C语言的表达方式本身就不是很严谨。
编程不但与机器交流,也与人交流,如果表达不严谨,就会出现象楼主“这里不太懂”的情况。

写a 和 写&a[0]
都不存在交流障碍的问题
如果存在
那么更多的是
读不懂的人需要提高
而不是需要迁就
#10
吹水佬2020-07-03 15:02
以下是引用lin5161678在2020-7-3 14:45:52的发言:


1 3 完全一样
并且和类型转换没有关系
是函数原型作用域的特殊要求

2是另一回事

void f(int a[], int len)
void f(int *a, int len)
这两句的表达意思是一样吗?
int a[]
int *a
这两句的表达意思是也一样吗?

#11
吹水佬2020-07-03 15:03
以下是引用lin5161678在2020-7-3 14:59:54的发言:


写a 和 写&a[0]
都不存在交流障碍的问题

有些东西不能从主观方面去想的
#12
吹水佬2020-07-03 15:06
对于C语言来说 int a[5] 的a与&a[0]是具有不同意义的
#13
吹水佬2020-07-03 15:12
以下是引用lin5161678在2020-7-3 14:59:54的发言:
读不懂的人需要提高
而不是需要迁就

同意这两句说法
迁就不是好事,入乡随俗,方言也要学。
#14
吹水佬2020-07-03 15:15
其实,提出“严谨”一说,只是说说楼主为何出现“这里不太懂”的问题
#15
lin51616782020-07-03 15:16
以下是引用吹水佬在2020-7-3 15:02:30的发言:


void f(int a[], int len)
void f(int *a, int len)
这两句的表达意思是一样吗?
int a[]
int *a
这两句的表达意思是也一样吗?

我特意强调了
并且和类型转换没有关系
是函数原型作用域的特殊要求


https://zh.
任何数组类型的参数都被调整到对应的指针类型,若数组声明器的方括号内有限定符,则它具有限定 (C99 起)。
int f(int[]); // 声明 int f(int*)
int g(const int[10]); // 声明 int g(const int*)
int h(int[const volatile]); // 声明 int h(int * const volatile)
int x(int[*]); // 声明 int x(int*)
#16
八画小子2020-07-03 15:26
int g(const int[10]);
int g(const int*)
貌似这两个不能完全等同吧?
#17
lin51616782020-07-03 15:36
以下是引用八画小子在2020-7-3 15:26:32的发言:

int g(const int[10]);
int g(const int*)
貌似这两个不能完全等同吧?

完全一样
#18
吹水佬2020-07-03 15:40
回复 15楼 lin5161678
理解
可能是看问题的角度不同
一个强调的是编译行为
一个是强调语言表达方式
#19
kr02020-07-03 19:33
指针可以指向数组名的首地址(即,a),f(a,5)意味着把数组名a的地址传给 指针 (指针就是地址)。
#20
吹水佬2020-07-03 20:32
以下是引用kr0在2020-7-3 19:33:27的发言:

指针可以指向数组名的首地址(即,a),f(a,5)意味着把数组名a的地址传给 指针 (指针就是地址)。

从语言表达的角度看
数组名与数组的首地址不是一回事吧
不能说数组名(a)就是数组的首地址
#21
数据总线2020-07-04 09:04
回复 15楼 lin5161678
这两句话在我的理解看来是不完全相等的呀~~
#22
lin51616782020-07-04 13:23
回复 21楼 数据总线
请问 有什么区别
请指点
#23
mmyem20002020-07-15 11:23
数组不能用做参数传递,所以用指针代替数组,取数组的首地址来传递指针
1