day4笔记(指针结构体入门介绍)
Posted 庸人冲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day4笔记(指针结构体入门介绍)相关的知识,希望对你有一定的参考价值。
指针
介绍指针前,先简单介绍内存
内存
-
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。
-
所以为了有效的使用内存,j将内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
-
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
内存的地址如何产生的?
32位
-
有32根地址线/数据线 (电线),一旦通电就有正电和负电之分 1 0,总共产生 2^32种 二进制序列,将这些二进制序列作为内存单元的编号,可以有2^32个内存编号。
-
如果内存每个内存单元只存放1bit,那么就算内存在大,最大也只能支持512MB。
2^32 = 4,294,967,296(Bit) = 536,870,912(Byte) = 524,288(KB) = 512(MB)
-
所以内存里一个单元存放的是1Byte,可以支持的最大内存为4GB
2^32 = 4,294,967,296(Byte) = 4,194,304(KB) = 4,096(MB) = 4(GB)
64位
就有64根地址线,内存编号有2^64个
指针变量
用来存放地址的变量叫做指针变量。
#include <stdio.h>
int main()
{
int a = 10;
// 1. 打印内存地址
printf("%p\\n", &a); //%p以地址格式打印,&取地址操作符
// 64位平台地址000000B193AFFB04 (16进制)
// 2. 将内存地址存入指针变量中
int* p = &a; // 变量名是p,p的类型是int*,*表示 p是真值变量
printf("%p\\n", p);
// 64位平台地址000000B193AFFB04 (16进制)
// 可以看到p里面存放的地址与&a是相同的
// 3. 解引用操作 --- *
*p = 20; // 对p进行解引用用操作,通过p里面存放的地址找到所指向的变量a,并将20赋值给a
printf("a=%d",a); // a=20;
// *p 这里其实就代表变量 a
return 0;
}
指针变量的大小
真值变量是用来存放地址的,因此:
在32位平台上,一个指针变量所占内存空间的大小为4个字节
在64位平台上,一个指针变量所占内存空间的大小为8个字节
#include <stdio.h>
int main()
{
printf("%d\\n", sizeof(char *)); // 32bit-4 b4bit-8
printf("%d\\n", sizeof(short *)); // 32bit-4 b4bit-8
printf("%d\\n", sizeof(int *)); // 32bit-4 b4bit-8
printf("%d\\n", sizeof(double *)); // 32bit-4 b4bit-8
return 0;
// 结论:指针大小在32位平台是4个字节,64位平台是8个字节。
}
结构体
结构体用来描述复杂类型,是程序员自己创造出的一种类型。
struct 结构体关键字
创建结构体类型的方法
// 例如创建一本书的结构体类型
struct Book
{
// 里面为结构体的成员
char name[20];
char publisher[20];
char author[20];
int price;
}; // 分号不可缺少! 用来结束类型定义
int main()
{
// 利用结构体类型-创建一个该类的变量,并初始化,
struct Book b1 = { "c primer plus","人民邮电出版社", "Stephen Prata", 60 };
// 结构体变量访问结构体的成员时使用 . 访问操作符
printf("书名\\t= %s\\n", b1.name);
printf("出版社\\t= %s\\n", b1.publisher);
printf("作者\\t= %s\\n", b1.author);
printf("价格\\t= %d元\\n", b1.price);
// 里面的属性值可以修改
b1.price = 30;
printf("价格\\t= %d元\\n", b1.price);
return 0;
}
结构体类型创建指针变量
. 访问操作符应用于结构体变量。
结构体变量名.成员
-> 访问操作符应用于结构体指针。
结构体指针名->成员
struct Book
{
char name[20];
char publisher[20];
char author[20];
int price;
};
int main()
{
struct Book b1 = { "c primer plus","人民邮电出版社", "Stephen Prata", 60 };
// b1 的类型为struct Book,因此用struct Book 来创建指针变量
struct Book* pb1 = &b1;
// 打印b1的地址
printf("%p\\n", pb1);
// 使用解引用操作符时 *pb1 等价于 b1 都是结构体变量,使用 . 来访问
// (*pb1)需要加括号
(*pb1).price = 50;
printf("(*pb1) = %d\\n", b1.price); // 修改的依然是b1.price
// 结构体指针访问结构体时 使用 -> 访问操作符
pb1->price = 30;
printf("pb1 = %d\\n", b1.price);
return 0;
}
结构体中的字符数组成员需要用strcpy() 来修改内容
- strcpy()是一个库函数 需要引用string.h
- strcpy(destination,存放的内容);
#include <string.h>
#include <stdio.h>
struct Book
{
char name[20];
char publisher[20];
char author[20];
int price;
};
int main()
{
struct Book b1 = { "c primer plus","人民邮电出版社", "Stephen Prata", 60 };
// strcpy -- string copy 字符串拷贝
// b1.name 是一个数组,本质上存放的一个地址
strcpy(b1.name, "C语言程序设计");
printf("%s\\n", b1.name);
return 0;
}
以上是关于day4笔记(指针结构体入门介绍)的主要内容,如果未能解决你的问题,请参考以下文章