【C语言】C——指针和结构体(1)
一、指针到底是个什么牛马?
1.说指针之前先来了解下——内存
2.内存用来干什么
3.指针
二、指针怎么使用
* ——解引用操作符
三、指针的大小
四、结构体
总结
——已经是第二次学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);
两种方法都是可以的,都一样
“.”————————结构体变量.成员名
“->”————————结构指针->成员名
总结
本篇只对指针和结构体做简单介绍,方便理解为主,欢迎指出错误