signed

QiShunwang

“诚信为本、客户至上”

day4笔记(指针、结构体入门介绍)

2021/6/9 9:16:57   来源:

文章目录

  • 指针
    • 内存
      • 内存的地址如何产生的?
      • 指针变量
        • 指针变量的大小
  • 结构体
    • 创建结构体类型的方法
    • 结构体类型创建指针变量
    • 结构体中的字符数组成员需要用strcpy() 来修改内容

指针

介绍指针前,先简单介绍内存

内存

  1. 内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。

  2. 所以为了有效的使用内存,j将内存划分成一个个小的内存单元,每个内存单元的大小是1个字节

  3. 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

内存的地址如何产生的?

32位

  1. 有32根地址线/数据线 (电线),一旦通电就有正电和负电之分 1 0,总共产生 2^32种 二进制序列,将这些二进制序列作为内存单元的编号,可以有2^32个内存编号。

  2. 如果内存每个内存单元只存放1bit,那么就算内存在大,最大也只能支持512MB。

    2^32 = 4,294,967,296(Bit) = 536,870,912(Byte) = 524,288(KB) = 512(MB)

  3. 所以内存里一个单元存放的是1Byte,可以支持的最大内存为4GB

    2^32 = 4,294,967,296(Byte) = 4,194,304(KB) = 4,096(MB) = 4(GB)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AMF4BjXn-1623200638650)(C:\Users\joker\AppData\Roaming\Typora\typora-user-images\image-20210522092108400.png)]

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() 来修改内容

  1. strcpy()是一个库函数 需要引用string.h
  2. 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;
    
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFjcnI1G-1623200638659)(C:\Users\joker\AppData\Roaming\Typora\typora-user-images\image-20210608160447634.png)]