基本数据类型.int ,char short.
int a;
a 标签代表一个地址的数据,里面的数据类型是int.所以占4个字节.
a=3;
给基本数据类型的标签赋直.就等于给标签代表的地址的数据赋直.
a 标签既然代表一个地址的数据,那么它的地址用&a来获得.
&a: 0x22ff1c: 03 00 00 00
&(&a)会错误.因为&a并不是内存某个地方.
数组类型.
int a[3]
首先,a[0],a[1],a[2] 和基本数据类型一样理解.
a[0] 标签代表一个地址的数据,里面的数据类型是int.所以占4个字节.
所以同上有&(a[0]),&(a[1])
&(a[0]):0x22ff04
到这里可以不再需要知道额外的知识了.数据和地址都可以得到了.
本来a本身没有任何意义了.
但是 &(a[0]) ,代表的首地址对于程序来说作用太大.传参,返回,等等.
所以用a来代表&(a[0]),a+1代表&(a[1])
但是a是地址常量.很多情况想把a改为其他直,以至于出来了指针,相当于把a这个地址常量再放入内存中,用一个(类型 *)的类型来表示.
就是指针类型了.不准确的理解其实就是一个2个字节的地址,存放了一个可变数组的首地址.
指针类型.
char * a="ag!";
首先,a[0],a[1],a[2], *a, *(a+1),*(a+2) 和基本数据类型一样理解.
所以同上有&(a[0]),&(a[1]) a, a+1
*a 标签代表一个地址的数据,里面的数据 占4个字节.存放的是首地址.
定义必须是(类型 * a) .因为只有首地址不行.必须知道存放的是什么类型.取多少字节组成一个数据.
a 标签和数组类型标签类试,代表第一个数据的地址.
c:0x403024
&a 表示 首地址存放的地址.
类
class a;
类的标签的含义和数组类试.只不过不用下标,而用.
a.name a.sex 和基本数据类型一样理解.
所以
&a.isbn: 0x22ff18
如果是简单的类,那么第一个数据的地址就是,类的地址
&a:0x22ff18
直类型做行参.
void change(Sales_item b)
会把类的成员变量作为参数全部入栈. 当然就不会修改函数外对象.
movb $0x62,0x18(%esp)
0x00401347 movl $0x3,0x1c(%esp)
0x0040134F mov 0x18(%esp),%eax//
0x00401353 mov 0x1c(%esp),%edx
0x00401357 mov %eax,(%esp)//类的数据成员入栈
0x0040135A mov %edx,0x4(%esp)//类的数据成员入栈
0x0040135E call 0x40136a <change(Sales_item)>
引用类型
void change(Sales_item &b)
0x00401342 movb $0x62,0x14(%esp)
0x00401347 movl $0x3,0x18(%esp)
0x0040134F lea 0x14(%esp),%eax//注意lea指令.这里是把地址入栈. 而且是类对象的第一个数据成员的地址,应该就是类的地址.
0x00401353 mov %eax,(%esp)
0x00401356 call 0x40136a <change(Sales_item&)>