#include<iostream> using namespace std; void print(const int ia[10]) { for(int i=0;i!=10;i++) cout<<ia[i]<<endl; } int main() { int a[10]={2,5,2,1,5,4}; print(a); }
这段代码中的 print函数中 cout<<ia[i]<<endl;为什么能通过呢?
不是说ia是一个指针? ----(可能是我一下子没转过来,虽然很low, 但还是望大家指点)
此外, 我将其改为 cout<<*(ia+i)<<endl; 肯定是对的,这个还是比较好理解.
-------------------------------------------
总结问题: ia作为原本数组a[10]首地址的指针的copy, 那么也同时具有了数组的特性? 能够直接将其表示为 ia[i]的形式 ?
于是乎, 做了个test:
#include<iostream> using namespace std; int main() { int a[]={2,4,5,6,2}; int *ia=a; cout<<ia[2]<<endl; }
也顺利完成了使命.
那么, 是否 ia作为原本数组a[10]首地址的指针的copy, 那么也同时具有了数组的特性? 能够直接将其表示为 ia[i]的形式 ? 这个问题答案是肯定的呢------是索引符的问题?
又奇葩的试了下如下形式:
#include<iostream> using namespace std; int main() { int a=2; int *ia=&a; cout<<ia[0]<<endl; }
也OK!!!!!!
那么是否我以后不写解引用直接利用类似 ia[0]也代表解引用呢?!!!
-------------------------------------------------------------
讲的比较乱,希望解答下这个困惑. Thank you~
你的理解是对的。
指针只是一个地址,可以当作数组使用。
只是 “那么是否我以后不写解引用直接利用类似 ia[0]也代表解引用呢?!!!”没理解。
另外:
print函数一般定义成:
print(const int *a, int length)
恩! 谢谢~ 函数只是测试(但也说明了习惯问题>.<). 很感谢.
那么是否我以后不写解引用直接利用类似 ia[0]也代表解引用呢----这句话想表达的就是这两者之间能替换,任何指针的解引用都等效于 a[0] 即, *a==ia[0] 是完全等效的(不仅仅针对数组.)---当然,写的时候基本不会写ia[0].
很谢谢~
@Tinyshine: 对。*a == ia[0]