【引入】提问:
(1)内存怎么编号?
电脑—32位 / 64位电脑;
32位 —32根地址线—地址线是物理存在的线,可通电—产生电信号1/0;
电信号转换为数字信息:1和0组成的二进制序列;
一共有 2^32 个二进制序列,即 2的32次方个内存单元;
(2)这样一个内存单位是多大空间?
一个char = 1 byte=8 bit,但是比特作为地址太小了,用字节刚好
【打比方】:
1字节相当于一间寝室,1间寝室有8张床(1字节=8比特),我们不会用床(bit)作为地址,而是会用寝室号(byte)作为地址;
2、指针 --就是地址(1)举例,sizeof _s int a= 4 ,即4个字节,在内存是哪四个字节空间呢?
f10 运行,调试- 窗口- 内存- 内存1 - &a
【补】** %p —打印地址**
可以发现,取地址并不会一次性把四个地址取完,只会取到从前往后的第一个字节地址
int main()
{
int a = 10; // a在内存中要分配4个字节
printf("%p\n",&a); //%p -打印地址
int * pa = &a; //pa是用来存放地址的,在c语言中称为 指针变量
// * 说明pa是指针变量,int说明pa执行的对象是int类型的
//如果是字符,对应如下
char ch = 'w';
char * pc = &ch;
return 0;
}
(2)解引用 *** 作符 * ,可以通过存储a的空间的地址来间接改变a的值
int main()
{
int a = 10; //有个整数a,值为10
int* pa = &a; //把a放进指针变量 pa里面,即 *pa取a的地址
*pa = 20; //*令pa变量里存储的值变为20,即令a的值为20
printf("%d\n",a); //结果= 20
return 0;
}
3、指针有各种类型 & 各种类型指针变量的大小
下列程序运行结果都= 4,即 指针的大小是相同的;
【原因】
①因为指针是用来存放地址的,指针需要多大空间,取决于地址的存储需要多大空间;
②电脑分为,32位/64位机器
32位机器-32个比特位组成的二进制序列,32bit=4byte
64位机器-64bit=8byte
③此时用的vs2019的解决方案平台配置是debug-v86, 是32位平台,因此编出的程序中指针大小都是4byte
——如果改成 debug-x64,配置成为64平台,运行结果都= 8
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(long long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
//运行结果都= 4
return 0;
}
//第26节 初识结构体-【重要】-衔接数据结构
1、创建不同类型的变量
—— C语言提供 结构体- struct 来描述复杂对象;
struct可以创建新的类型变量;
【举例】
①创建一本书的类型
struct book
{
char name[20]; //名字是字符号,给他一个20个字符的空间大小?【可以这样理解吗?】
float price;
char id[30];
}
②创建一个学生的类型
struct stu
{
char name[20]; //名字是字符号,给他一个20个字符的空间大小?【可以这样理解吗?】
int age; // name age score 等称为结构体里面的**成员变量**
double score;
}
2、使用创建的变量
以上诉创建的学生变量为例子,结构体创建和初始化后,下面提供三种找到成员变量的方法①②③:
方法①:使用 ** . *** 作符**, s. 就可以找到成员变量
方法②:通过指针, 由*ps=&s ,可知指针ps找的是s的地址,则(ps). name找的是地址中变量存放的name (数据/元素)
方法③:通过 *** 作符 ->箭头 , ps-> 相当于②指针中的(ps).name,都是先找到指针的指向对象,再找到成员里的name
struct stu
{
char name[20];
int age;
double score;
}
int main()
{
struct stu s = {"张三",21,95.8};
//学生变量stu有基本信息,就像上面创建学生类型一样,被大括号框起来了
//此时已经给变量s赋值了,称为 **结构体的创建和初始化**
//方法①
printf("%s %d %lf\n",s.name,s.age,s.score);
// . *** 作符,可以找到成员变量
// s. 成员变量就可以找到它的成员变量
//方法② 如果是通过指针来找变量
struct stu * ps=&s;
printf("%s %d %d\n", (*ps).name, (*ps).age, (*ps).score);
// 由*ps=&s ,可知指针ps找的是s的地址,则(*ps).name找的是地址中变量存放的name (数据/元素)
// 方法③ *** 作符 -> 箭头
printf("%s %d %lf\n", ps->name, ps->age, ps->score);
//此时③的ps->相当于②的(ps*).name,都是先找到指针的指向对象,再找到成员里的name
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)