【C语言】C——指针和结构体(1)
——已经是第二次学C语言了,第一次学就是在指针这块遇到了问题,现在回过头再来学习,还是有必要自己整理一些干货的
****不是详细版本 ------仅方便理解****
一、指针到底是个什么牛马?
1.说指针之前先来了解下——内存
由于我们的电脑有32位/64位两种,拿32位来举例子
32位——32根地址线(也就是电线,给他们通电,产生0/1)
于是乎就会产生
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000100
00000000000000000000000000001000
。。。
11111111111111111111111111111111
这种32个一串的地址一共有2^32 个也就是2^32 个bit,而1个字节=8bit,所以就会有(2^32)/8个内存单元
2.内存用来干什么
当然是用来存东西,举个栗子
然后呢,假设这4个字节的内存空间编号为501 502 503 504
问题来了,那a到底是哪个格子呢?让代码运行起来用监视器查看一下
监视器一查看就会发现&a取到的其实是第一个字节的地址,同时还发现,取地址是从低地址往高地址取的(从第一位往后,因为只要找到了第一位,后面的就依次+1即可),也就是如图
3.指针
接着上边,将a的地址给它打印出来,这里注意一个问题,因为每次的内存都是重新分配的,所以每一次打印出来的地址是不一样的
指针的定义
& 取地址操作符``
a 整型变量
&a 对a取地址 即 &a表示a的地址
p=&a把一个地址放进p中,地址=指针,所以p是一个指针变量
定义一个指针变量的语法为:int *p=&a;
为什么要这样定义
举个栗子
char ch = 'w';//ch是个char类型变量
char* p = &ch;//所以要用char*
地址和变量的关系请看图
存放10的地址就是指针,地址就好比你家门牌号 即————地址=指针
二、指针怎么使用
* ——解引用操作符
要想使用指针,就要用到解引用操作符,也就是 “ * ”号
int a =10;//先把10赋值给a
int* p=&a;//把a的地址存于指针p
*p=20;//通过使用解引用操作符,通过a的地址找到a,把20赋给a
printf("%d\n",a);//打印出来的a就是20
三、指针的大小
打印出各种类型的指针的长度
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
运行结果为
为什么全都是4,那是因为在32位的机器上,一个内存单元的大小为1byte=8bit,而4个字节(byte)=32个bit,上栗子``
00000000000000000000000000000001//这是一个32位地址
而char* short* int* long* float* double* 定义的是一个指针变量
指针变量里存放的也就是一个地址,所以说只要是地址,就是4个字节(64位的电脑,则为8个字节)
地址大小只取决于平台
四、结构体
一个复杂对象,栗如:
学生:
名子+年龄+性别+身高
—————————————————————————————————————
当遇到这种对象时,基本类型已经无法表示,这时候就需要用到结构体
#include <stdio.h>
struct Student//声明一个学生类型
{
char name[20];
int age;
char sex[5];
char id[12];
};//注意这里还有个分号不要忘了
int main()
{
//创建结构体变量
struct Student s1={
"张三",20,"男","20200506"};
struct Student s1={
"李四",20,"女","20200506"};
return 0;
}
语法格式就是这个样子,依葫芦画瓢,用就完了
结构体变量如果要访问成员变量,就要用 “.”操作符
printf("名字:%s 年龄:%d 性别:%s 学号:%s", s1.name, s1.age, s1.sex, s1.id);//即可访问并打印各个成员变量
同样,可以用指针来访问变量成员
struct Student*p=&s1;
printf("名字:%s 年龄:%d 性别:%s 学号:%s", (*p).name, (*p).age, (*p).sex, (*p).id);
printf("名字:%s 年龄:%d 性别:%s 学号:%s", p->name, p->age, p->sex, p->id);
两种方法都是可以的,都一样
“.”————————结构体变量.成员名
“->”————————结构指针->成员名
总结
本篇只对指针和结构体做简单介绍,方便理解为主,欢迎指出错误
//创作不易,如果觉得可以,三连走起来~看到会回访//