2022年6月16日星期四

2022年6月16日-3

 2022年6月16日

*解引用操作符、间接访问操作符

#include<stdio.h>
int main()
{
    int a = 114; //先申请一个4字节空间
    printf("我要打印%p\n", &a);
    int* pb = &a; //int*是一种新的类型,告诉我们p是一个变量——指针变量,用来存放地址。
    printf("我要打印%p\n", pb);
    *pb = 20;//*解引用操作符、间接访问操作符
    printf("%d\n", a);//

    return 0;
}

%p

int*存放int类型变量的地址,double*用来存放double类型变量的地址

 

 结构体

之前的int, double, char等等只能表示一种类型,但为了表示诸如人物信息、书的基本信息这种复杂对象,需要引入结构体

如商品-名字-价格

//结构体初始化
struct item//创建一个名叫item的结构(自定义类型)
{
    char name[20];//这个结构体,第一个类型为名叫name的字符组[最多20个字]
    short int price;//第二个类型是名叫price的短整型

};//这里的;千万别忘了,与代码块不同
int main()
{
    struct item num1 = {"钻石剑" , 60};
    printf("商品:%s\n", num1.name);
    printf("价格%d\n", num1.price);
    num1.price = 0.2*("%d",num1.price);//修改price这个变量
    printf("打骨折后价格:%d\n",num1.price);
    return 0;
}

 

注意这里的num1.name和num1.price:            .   点操作符:应用到结构体的变量,  此时 . 可以找到成员

price是一个变量,可以很简单的修改。那么如何修改name这个数组

用到strcpy(string copy)字符串拷贝,是一个库函数<string.h>

strcpy(目的地..., 数据来自于...)

如strcpy(num1.name, "下届合金剑");

 

 

如果想用“取地址”来表示,需要注意以下

//结构体试做
struct item//创建一个名叫item的结构(自定义类型)
{
    char name[20];//这个结构体,第一个类型为名叫name的字符组[最多20个字]
    short int price;//第二个类型是名叫price的短整型

};//这里的;千万别忘了,与代码块不同
int main()
{
    struct item num1 = {"钻石剑" , 60};//此时num1的指针的类型是struct item* pb = &num1
    struct item* pb = &num1;//找到变量num1的地址,并储存在pb里
    //利用pb打印名字和价格
    printf("名字 = %s\n", (*pb).name);
    printf("价格 = %d\n", (*pb).price);
    return 0;
}

-> 箭头操作符,结构体指针指向成员   ->成员

//结构体试做
struct item//创建一个名叫item的结构(自定义类型)
{
    char name[20];//这个结构体,第一个类型为名叫name的字符组[最多20个字]
    short int price;//第二个类型是名叫price的短整型

};//这里的;千万别忘了,与代码块不同
int main()
{
    struct item num1 = {"钻石剑" , 60};//此时num1的指针的类型是struct item* pb = &num1
    struct item* pb = &num1;
    //利用pb打印名字和价格
    printf("名称%s\n", pb ->name);
    printf("价格%d\n", pb->price);//指向关系,容易理解
    return 0;
}

整个流程以及scanf函数的应用

错误应用

struct item
{
    char name[20];//命名
    int price;//价格
};

int main()
{
    struct item num1 = { "钻石",20 };
    struct item* pb = &num1;
    scanf_s("%d", &num1.name, &num1.price);
    printf("名称%s\n", pb->name);
    printf("价格%d\n", pb->price);
        return 0;
}

在scanf输入name(如黄金)时出错

scanf_s("%s%d", &num1.name, &num1.price);

这句有问题,因为name是一个数组,不是变量

//错误例2,
struct item
{
    char name[20];//命名
    int price;//价格
};

int main()
{
    struct item num1 = { "钻石",20 };
    struct item* pb = &num1;
    char rename[] = { scanf_s("%s") };
    
    strcpy_s(num1.name,("%s",rename));//本想先新建一个字符串,赋值,再替代原先的name,但好像学费了
    scanf_s("%d", &num1.price);
    printf("名称%s\n", pb->name);
    printf("价格%d\n", pb->price);
        return 0;
}

 

0 评论:

发表评论