调用函数时,
()就是函数调用操作符
struct Stu//创建一个结构体类型
{
//成员变量
char name[20];
int age;
char id[20];
};
int main()
{
int a = 10;
struct Stu s1 = { "张三",20,"20211109" };//创建一个学生对象s1,并初始化
struct Stu* ps = &s1;
printf("%s\n", (*ps).name);
printf("%d\n", (*ps).age);
printf("%s\n", (*ps).id);
printf("%s\n", ps->name);//->结构体指针操作符
printf("%d\n", ps->age);
printf("%s\n", ps->id);
printf("%s\n", s1.name);
printf("%d\n", s1.age);
printf("%s\n", s1.id);
//结构体变量.成员名
return 0;
}
表达式求值
表达式求值的顺序一部分由操作符的优先级和结合性决定,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
隐式类型转换
C的整型算数运算总是至少以缺省整型类型的精度来进行的,整型提升,
int main()
{
char a = 3;//00000011
char b = 127;//01111111
char c = a+b;//10000010
printf("%d\n", c);//1111111111111111111111110000010补码
// 1000000000000000000000001111110原码
// -126
return 0;
}
算术转换
两个操作数类型不同时,要把晓得类型转换成更大操作数的类型后执行运算
操作符的属性
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
如果表达式不能通过操作符的属性确定唯一的计算路径,那么这个表达式就是存在问题的
指针
是编程预压你的一个对象,利用地址,他的值直接指向存在电脑存储器中另一个地方的值,地址指向该变量单元,称为指针
其实就是存放地址的变量,存放在指针中的值被当成地址处理
int main()
{
printf("%d\n",sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));
return 0;
}
指针类型决定了指针进行解引用操作的时候,能够访问的空间的大小
指针类型决定了:指针走一步走多远
int*p:p+1 4
char* p;p+1 1
double*p; p+1 8
野指针:指针指向的位置是不可知的
1.指针未初始化
2.指针越界访问
3.指针指向的空间释放
如何避免?
1.指针初始化
2.小心指针越界
3.指针指向空间释放及时置NULL
4.之魂使用之前检查有效性