c++笔记4 - webdancer's Blog

c++笔记4

webdancer posted @ 2010年10月07日 08:34 in 编程语言 with tags c++ , 1550 阅读

c/c++的数组与指针问题还是没有搞得太清楚,再仔细的研究一下。

指针:指向对象,存放对象的地址。

数组:一块连续的内存空间,静态初始化时确定数组的大小。

动态内存分配:在程序空间的动态内存区(堆)进行的空间分配。

赋值表达式:

LEFT = RIGHT

在赋值表达式,左右都能出现的成为左值。如:LEFT;只能出现在右边的称为右值。

在C语言里,又将左值分为了可修改与不可修改的左值。例如:数组名,就是个不可修改的左值。

int  a[4]={1,2,3,4};
int  *pa=a;

这样,pa与a都可以来引用数组里面的元素了,但是a与pa还是有区别的:pa可以作为可修改的左值,用来指向其他的对象,但是a是一个不可修改的左值,不能指向其他的对象。

数组名和指针的区别就是:数组名作为一个符号,在编译时是可知的,可以直接取到a的值。而指针作为变量,必须首先取得指针的值,然后得到地址。

通常,定义指针:

int *p = 0; // 或int *p = NULL;
int *p = new int;//C中用:int *p = (int *)malloc(sizeof(int)); 

二维数组的问题:

在c/c++里没有所谓的真正的二维数组,只有数组的数组,就是数组的元素还是数组,也是连续分配的空间。

例如:

int a[4][4];
int main(){
	int i=0;
	cout<<a[i]<<endl;
	cout<<&(a[i])<<endl;
	cout<<a+i<<endl;
	cout<<*(a+i)<<endl;
	cout<<*(a[i])<<endl;
	char c;
	cin>>c;
}

运行的结果为:

00A88138
00A88138
00A88138
00A88138
0

分别的意思是:

a[i]:第i行第0列地址。

&a[i]:第i行行首的地址。

a+i:第i行行首的地址。

*(a+i):第i行第0列地址。// *(a+i)+j与a+i+j 就有了明显的区别。

可以看出通过*(a+i)的行地址转为列地址,这样可以继续访问列里的元素。为什么:*(a[i])的值为:0,不明白??blush

怎么申请动态的二维数组:

c语言:

int **pp=0, i;
pp = (int **)malloc(sizeof(int*)*row);
for (i=0; i<row; i++)
pp[i] = (int *)malloc(sizeof(int)*colum); 

c++语言:

int **pp=new int* [row];
for(int i=0;i<row;++i){
	pp[i]=new int[colum];
}

当然,指针的理解还得靠以后的逐渐积累,例如在函数参数的传值的应用,函数指针,太强大,真是有点晕。参考了很多人的东西,表示感谢。

Avatar_small
Garfileo 说:
2010年10月07日 21:20

*(a[i]) 的含义是:从数组 a 取下标为 i 的元素(假设为 n),然后用 * 运算符去访问内存中地址为 n 的空间中所存储的数据,这样就得到了难以预知的数字了。

*(a+i) 是没有问题的,因为 a 表示的数组地址, i 在此表示偏移量,这样 (a+i) 所得到的是你可以确知的内存地址,并且其中所存储的数据也是你可知的,这样用 * 运算符就可以取出该内存地址所存储的数据。

xinchao 说:
2010年10月08日 09:42

@Garfileo: 嘿嘿,谢了。明白了


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee