c++笔记4 - webdancer's Blog
c++笔记4
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,不明白??
怎么申请动态的二维数组:
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]; }
当然,指针的理解还得靠以后的逐渐积累,例如在函数参数的传值的应用,函数指针,太强大,真是有点晕。参考了很多人的东西,表示感谢。
2010年10月07日 21:20
*(a[i]) 的含义是:从数组 a 取下标为 i 的元素(假设为 n),然后用 * 运算符去访问内存中地址为 n 的空间中所存储的数据,这样就得到了难以预知的数字了。
*(a+i) 是没有问题的,因为 a 表示的数组地址, i 在此表示偏移量,这样 (a+i) 所得到的是你可以确知的内存地址,并且其中所存储的数据也是你可知的,这样用 * 运算符就可以取出该内存地址所存储的数据。
2010年10月08日 09:42
@Garfileo: 嘿嘿,谢了。明白了