第25节 初识指针【重点】-非常重要
1、内存
【引入】提问: (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;
printf("%p\n",&a);
int * pa = &a;
char ch = 'w';
char * pc = &ch;
return 0;
}
(2)解引用操作符 * ,可以通过存储a的空间的地址来间接改变a的值
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;
printf("%d\n",a);
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*));
return 0;
}
//第26节 初识结构体-【重要】-衔接数据结构
1、创建不同类型的变量
—— C语言提供 结构体- struct 来描述复杂对象; struct可以创建新的类型变量; 【举例】 ①创建一本书的类型
struct book
{
char name[20];
float price;
char id[30];
}
②创建一个学生的类型
struct stu
{
char name[20];
int age;
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};
printf("%s %d %lf\n",s.name,s.age,s.score);
struct stu * ps=&s;
printf("%s %d %d\n", (*ps).name, (*ps).age, (*ps).score);
printf("%s %d %lf\n", ps->name, ps->age, ps->score);
return 0;
}
|