#include<stdio.h>
struct Object
{
int id;
char name[256];
};
//传值方式
void Text1(Object a)
{
printf("id: %d,name: %s", a.id, a.name);
}
//传地址方式
void Text2(Object* a)
{
printf("id: %d,name: %s", a->id, a->name);
}
int main()
{
Object obj = { 123, "zhangsan" };
Text1(obj);
Text2(&obj);
return 0;
}
1.传值方式
函数的形参是传入的实参的一份拷贝,形参是函数的局部变量,只在函数内部有效。
在函数Text1被调用时,有两个Object对象,其中一个叫obj,定义在main函数里,另一个叫a,是函数Test1里的局部变量。
在传值调用时,讲obj的值赋给了变量a.相当于:
Object a = obj;
因此说,对象a是obj的一个拷贝,下面分析这一部操作的资源消耗:
(1)从内存资源消耗上看(空间角度),对象a耗费260个字节的内存。
(2)从CPU资源的耗费上看(时间角度),从对象obj到对象a需要复制260个字节。
2.传地址方式
在函数Text2被调用时,传入一个对象obj的地址,既有一个Object*指针来表示对象obj的地址
Object *p = &obj;
下面分析这一部操作的资源消耗:
(1)从内存资源消耗上看(空间角度),指针p占据4个字节,所有的指针其实只是一个整数(表示内存地址)
(2)从CPU资源的耗费上看(时间角度),不需要复制数据,只需传递一个整数地址。
通过比较发现,传地址方式在性能上远远优于传值方式,它使用了较少的资源完成了相同的事情。在内存上,传地址方式使用了较少的内存,在CPU消耗上,传地址方式耗费的CPU操作也非常少。
所以在C/C++里,当一个对象的体积较大时(结构体。数组),总是使用传地址方式来传递参数
指针变量为什么占4个(8个)字节?
. cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推。32位操作系统针对的32位的CPU设计。64位操作系统针对的64位的CPU设计。操作系统只是硬件和应用软件中间的一个平台。我们的CPU从原来的8位,16位,到现在的32位和64位。
# include<stdio.h>
int main(void)
{
int i = 373;
double j = 4.5;
char ch = ‘A’;
int * p = &i;
double * q = &j;
char * r = &ch;
printf(“%d %d %d\n”,sizeof(p), sizeof(q), sizeof(r));
return 0;
}
运行结果是 4 4 4
int main(void)
{
int i = 373;
double j = 4.5;
char ch = ‘A’;
int * p = &i;
double * q = &j;
char * r = &ch;
printf(“%d %d %d\n”,sizeof(p), sizeof(q), sizeof(r));
return 0;
}
运行结果是 4 4 4
指针不同于一般变量,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样,输出的4 4 4,说明指针长度为4字节,可以记录的地址范围是0x00000000~0xFFFFFFFF,这个范围才是指针变量的值。比如说一个char 1字节,可以存在0x0,也可以位于0xFFFFFFFF,而和char占用1字节还是100字节无关,*指针的范围只和机器字和系统有关比如你的32位系统,指针长度为4,在64位操作系统下那么就都是8了。