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 评论:
发表评论