C语言 -- 二维数组得一些需要注意得细节

来源:互联网 发布:数据分析培训班多少钱 编辑:程序博客网 时间:2024/05/22 14:10
问题一int A[100][200];for(i=0;i<100;i++)for(j=0;j<200;j++)sum += A[i][j];要求对上述程序做优化答案:int A[100][200];int *B = &A[0][0];for(i=0;i<100*200;i++)sum += *(B+i);原因:A[i][j] = *(*(a + i*200)+j), 所以第一种方案每次for循环都得做乘法,效率较低. 而第二种安案不需要做乘法,效率较高.--------------------------------------------------------------------------------------------------问题二a[][2] = {1,2,3,4};        cout << a << endl;        cout << *a << endl;        cout << *a+1 << endl;        cout << a+1 << endl;        cout << a[1]<< endl;        cout << *(a+1)<< endl;        cout << *(a[1])<< endl;结果输出为   :0012FF700012FF700012FF740012FF780012FF780012FF783以为都搞明白了,自己测了下又糊涂了..搞不明白 : 1.  既然数组名可以作为指针使用,为什么对它解除引用的结果不是它指向地址的存储值?            2.  a+1    a[1]   返回值都是指针值:0012FF78 ,那么为什么 *(a+1)    *(a[1])返回的一个是地址,一个是int值3呢?和优先级也没有关系,到底编译器怎么处理的呢?
关于数组的退化请见:http://bbs.chinaunix.net/viewthread.php?tid=1031622int a[][2] = {1,2,3,4};(1)        cout << a << endl;a会退化成&a[0], 类型为pointer to int[2] (2)       cout << *a << endl;a会退化成&a[0] pointer to int[2] *a的类型为int[2]最后,*a会退化成&(*a)[0],即&a[0][0](3)        cout << *a+1 << endl;接上面,*a为&a[0][0],则*a+1则为&a[0][1](4)        cout << a+1 << endl;a会退化成&a[0], 则a+1即为&a[1](5)        cout << a[1]<< endl;a[1]类型为int[2],它会退化为&a[1][0](6)        cout << *(a+1)<< endl;a会退化成&a[0], 则a+1即为&a[1]*(a+1)则为a[1],其类型为int[2]因此,它又会退化为&a[1][0](7)        cout << *(a[1])<< endl;a[1]类型为int[2],它会退化为&a[1][0]*a[1]即为a[1][0]
原创粉丝点击