关于数组 论坛精选

来源:互联网 发布:java面向机器 编辑:程序博客网 时间:2024/05/16 19:29

问:

其实很简单的一个问题:指针和地址等价么?数组名和指针等价么? 
for example: 
int a[4]={1,2,3,4}; 
int (*pa)[4]=a;//这里为什么编译不过,不是说pa是指向一个带有四个元素的整型数组么?我这里完全符合条件啊,那为什么编译不过(VC)? 

int b[2][3]={0}; 
int (*pb)[3]=b;//这里就能编译过了!!和上面的有什么区别? 


int c[2][3]={0}; 
int** pc=c;//编译不过,为什么? 
请各位各抒已见啊,呵呵....

 

 

1  数组名和指针等价吗? 

应该是等价的. 

(1)int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型。 

可以这样来用: 

#include <iostream.h> 

void main() { 

int* p[2]; 
int a[3] = {1, 2, 3}; 
int b[4] = {4, 5, 6, 7}; 
p[0] = a; 
p[1] = b; 
for(int i = 0; i < 3; i++) cout < < *p[0] + i;// cout < < **p + i; 
cout < < endl; 
for(i = 0; i < 4; i++) cout < < *p[1] + i;// cout < < **p + i; 



(2)对于 int (*p)[2], 它相当于一个二维数组的用法,只是它是一个n行2列的数组,可以这样来用: 

#include <iostream.h> 

void main() { 

int (*p)[2]; 
int b[3][2] = {{1, 2}, {3, 4}, {5, 6}}; 
p = b; 
for(int i = 0; i < 3; i++) { 
  for(int j = 0; j < 2; j++) //cout < < p[i][j]; //cout < < *(*(p+i)+j); 
  cout < < endl; 



注意:对于(1)为行数确定、列数不确定,即为2*n型的。(2)为n*2型的数组的指针用法,即行数不确定、列数确定。对于(1)其等价形式如下: 

#include <iostream.h> 

void main() { 

int** array; 
array = new int* [2]; 
int a[3] = {1, 2, 3}; 
int b[4] = {4, 5, 6, 7}; 
array[0] = a; // *array = a; 
array[1] = b; // *(array+1) = b; 
for(int i = 0; i < 3; i++) cout < < array[0][i];// cout < < *array[0] + i; 
cout < < endl; 
for(int j = 0; j < 4; j++) cout < < array[1][j];// cout < < *array[1] + j; 


其实以上用法即这我们常用的动态二维数组的用法。

 

3其实很简单的一个问题:指针和地址等价么?数组名和指针等价么? 

for example: 
int a[4]={1,2,3,4}; 
int (*pa)[4]=a;//这里为什么编译不过,不是说pa是指向一个带有四个元素的整型数组么?我这里完全符合条件啊,那为什么编译不过(VC)? 


这里pa其实是指针数组,而a只是一维数组,所以要int (*pa)[4]=&a; 

int b[2][3]={0}; 
int (*pb)[3]=b;//这里就能编译过了!!和上面的有什么区别? 

这里b是2维数组,可以认为把二维数组的地址给了指针b 


int c[2][3]={0}; 
int** pc=c;//编译不过,为什么? 

2维指针不等于2维数组,数组需要至少列数固定

 

4 pa要指向a[4]自然要 &a 

如果 int na;  int *p =na  这个跟上面一样,都是编译不过的 int *p = &na就没有问题了. 
主要是类型要匹配. 
&a的一个int [4]的地址,其类型为int (*)[4] 

------------- 
int b[2][3]={0}; 
int (*pb)[3]=b;//这里就能编译过了!!和上面的有什么区别? 
这个相当于这样的: 
int (*pb)[3]=&(*b); 
*b是一个int [3] 
所以&(*b)就是一个指向int [3]的地址就是int (*)[3]所以类型匹配 所以 可以了 

---------------------- 
而下面这样也是可以的,类型匹配是王道 
  int a[4]={1,2,3,4}; 
  int *pa=a;// 
  printf("%d",pa[3]); 
---------------------- 


int c[2][3]={0}; 
int** pc=c;//编译不过,为什么? 
请各位各抒已见啊,呵呵.... 
你自己看下类型匹配不??????  不匹配就不能编译过的 
c为int (*)[3] 
pc为int **你说可以么

 

int c[2][3]={0}; int** pc=c;//编译不过,为什么?



pc 是一个指向 int 型的指针的指针,而 c 是一个指向二维数组的首地址的指针。当然不能赋值...

 

6 关于编译器优化

 

引用楼主 spinachrag 的帖子:
class A 

public: 
~A() { cout  < < 1; } 
}; 

int main() 

A a = A(); 

问输出几个1呢? 

class A 

public: 
A() { } 
~A() { cout  < < 1; } 
}; 

int main() 

A a = A(); 

又输出几个呢? 


答案:程序1, VC8里输出两个, g++ 里一个, 程序2, 都输出一个 
求原因 
初学c++, 很菜, 不好意思 


这是编译器优化的结果。 
A a = A(); 
如果优化, 等同于A a;  //只创建一个对象。 
如果不优化,等同于 A a; a=A(); //创建一个对象,再创建一个临时对象赋值。 
两种创建方式不会影响结果的。 
把生成两个对象的vc8 优化选项开高点,例如-o3 试试, 估计就只创建一个对象了

 

原创粉丝点击