C语言中指针与数组有什么关系

上面的函数参数是*Q,为什么函数内部就用上了Q[i]这种形式

c语言中数组和参数可以通用,数组有一个基址,c中用指针指向它,计算数组元素地址的时候,是基址+元素字节数*(元素序号-1)。追问

嗯,就是上面的函数参数为int* Q,而在函数内部就直接用Q[i]这种方式来对内存操作,所以不太明白

追答

两种方式都是可以的,用Q[i]的形式方便,编译器给你算好了;直接用指针要自己计算地址,计算方法Q+sizeof(int)*(i-1)。
数组作为参数传递时,习惯写作指针形式。

追问

就是上面的函数genarate()中的参数是int* Q,而内部直接写成了Q[i],这样也对吗?

追答

当然对了。习惯就是这样写的,也可以写成

void  genarate(int a,  int b, int N, int Q[]){

都没有问题。只是打一个*号比两个[]方便。

c中指针和数组是等价的。

追问

哦,是这样啊,谢谢,还想问您一下,就是在vs中上面这个程序只有后缀为.cpp才能编译通过,文件若是为.c就会报错,这是为什么,这明明就死一个c程序

追答

你选的C++工程,开发环境强制的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-07
数组名代表数组在内存中的首地址。
指针可以存储一个地址,也即指向某地址。
在C中,对于某地址的访问有两种方式:
1.直接访问,如用变量名进行赋值等;
2.间接访问,例如数组Q[i]。
基于上述两种形式,C语言标准规定,指针可以模拟数组的行为。so,你的问题得解。追问

还是不太明白,就是平时好像只见过*Q+n和*(Q+n)这种形式的,但是上面的函数参数数int* Q,而在函数内部就直接用Q[i]这种方式来对内存操作

追答

关键点就在那句话:指针可以模拟数组的行为。

另外,cpp后缀和c后缀使用的编译器是不一样的。前者是c+编译器。后者是c编译器。所以必然不同

相似回答