【C语言】

【C语言】,第1张

第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;  // 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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2991005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存