关于数组 论坛精选
来源:互联网 发布: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 **你说可以么
5
- int c[2][3]={0}; int** pc=c;//编译不过,为什么?
pc 是一个指向 int 型的指针的指针,而 c 是一个指向二维数组的首地址的指针。当然不能赋值...
6 关于编译器优化
这是编译器优化的结果。
A a = A();
如果优化, 等同于A a; //只创建一个对象。
如果不优化,等同于 A a; a=A(); //创建一个对象,再创建一个临时对象赋值。
两种创建方式不会影响结果的。
把生成两个对象的vc8 优化选项开高点,例如-o3 试试, 估计就只创建一个对象了
- 关于数组 论坛精选
- CSDN论坛中一个关于数组指针的讨论帖
- symbian Nokia 论坛 wiki精选 汇总
- 2017.5.19论坛问题精选以及解决方法
- 数组的精选讲解
- PHP精选数组函数
- PHP精选数组函数
- 关于技术,关于论坛
- 关于论坛搬家
- 统计关于论坛
- 关于论坛的英语词汇
- 关于论坛建设问题
- 关于部署 phpbb 论坛
- AS3.0数组的方法大全(精选)
- AS3.0数组的方法大全(精选)
- AS3.0数组的方法大全(精选)
- AS3.0数组的方法大全(精选)
- [论坛专贴]关于接口
- C# 连接自动拨号与断开分析
- SQL2005中对一个记录很大的表增加一个自增字段,总是增加失败
- 模式和生活(第一篇)
- 详细介绍五种JSP跳转方法
- Windows XP系统启动过程概述
- 关于数组 论坛精选
- 为客户万科做的sofun搜房网论坛专用发帖群发机(C#.NET)
- 无法安装winrar,是为什么?
- html meta tag
- 未能加载类型“WebApplication1._Default”
- 关于去耦电容和旁路电容
- Head First C# 中文版 图文皆译 第八章 枚举和集合 page337
- 给客户美特斯邦威做的简单百度新闻资讯采集程序(C#.NET)
- 姑爷爷您走好