-
预科第十天
今天老师讲的是指针,老师在讲的时候单个例子都能明白,但是一旦不讲就感觉脑袋发懵,不清楚哪儿有问题。好像是设定好的程序,只要一到数组指针函数这一块儿就感觉脑袋内存不够用,总会当机。
25.指针
1>指针:实际上就是地址
2>怎么定义指针:
下面就需要定义一个变量来存储整型变量的地址,
/*先算*符号,表明p不是一个普通(int,char,float,double)的变量,而是一个地址变量,再算前面的int,代表将来这个p是存储的int类型变量的地址,而不是其他类型变量的地址
*/
int i=1;//定义整型变量,就应该在内存当中分配好了空间,地址就应该固定不变
int *p=&i;//int *p=0xfff
//*的用法:*变量名:*是去取地址所对应的存储单元里面的值
printf("i=%d\n",*p);
*p=9;//*(&i)=====>i=9
printf("i=%d\n",i);
printf("%p\n",&i);
printf("%p\n",p);
printf("%p\n",&p);
const:常量
/*const修饰变量,代表将来这个变量将来的只读,不能被更改,
注意点:const修饰的变量一定要在初始化的时候给定初值,因为将来不能被再次赋值
*/
const int a=7;
//int const a=7;
printf("%d",a);
int a=7;
const int *p=&a;const写在前面代表将来不能通过p去间接的更改a的值
int const *p=&a;const写在int后面代表将来不能通过p去间接的更改a的值
int * const p=&a;const写在*后面代表将来p这个变量的值只读
const int * const p=&a;const这样写代表啥都不能改
多级指针
二级指针:二级指针里面的值就是一级地址变量的地址
int a;
int *p=&a; //一级指针
int **p1=&p; //二级指针
int ***p2=&p1; //三级指针
#include
int main()
{
int a,b;
int *p=&a;
int *q=&a;
if(p==q)
{
printf("====\n");
}
return 0;
}
struct是创造出来一个特殊的类型,系统中没有这个类型
格式:
struct 结构体名称
{
结构体的相关属性;
};
// 学生:分数、学号
struct Student
{
float score;
int num;
};
//数据类型+变量名;
//变量的定义,.在C语言当中相当于‘的’
struct Student stu;
//3.初始化:'.'
stu.score=18.7;
stu.num=9;
//1.初始化:
struct Student stu1={12.5,1};
//2.初始化:
struct Student stu2=stu1;
printf("stu2={score=%f,num=%d}\n",stu2.score,stu2.num);
struct Birthday
{
int year;
int month;
int day;
};
struct Person
{
char sex;
int age;
struct Birthday birthday;
};
struct Person p1={'m',20,{2000,1,1}};
struct Person p2;
p2.age=18;
p2.sex='f';
p2.birthday.year=1990;
p2.birthday.month=1;
p2.birthday.day=1;
struct Person p3=p2;
字节对齐
1>如果是基本数据类型(int,char,float,double);第一个成员属性从偏移量为0处分配,以后的成员属性是从他本身字节数的最小倍数开始分配
2>如果不是基本数据类型,是集合类型,数组,结构体,比如里面有一个成员属性是结构体类型,struct X{ int a;char ch;double f;};是从他的成员属性里面最大的字节数的最小倍数开始分配
3>最后收尾的时候,整个字节数要是最大成员属性字节数的最小倍数
/*
int:4
char:1
float:4
double:8
*/
struct A
{
char ch;//0 char第一个成员属性从偏移量为0处分配,char为1字节,记为0;
int m;//4--7 int从本身字节数的最小倍数开始;
char ch1;//8 char类型只有1个字节,+1;
double i;//16--23 double从本身字节数的最小倍数开始,从9开始,找8的最小倍数;
};//24 从0-23有24个字节
printf("%ld\n",sizeof(struct A));//struct A为24字节,32位机器得出的是20;
struct B
{
int i;//0--3 int第一个成员属性从偏移量为0处分配,int类型4字节,0-3为4字节;
struct A a;//8--31 从struct A的成员属性里面最大的字节数double的最小倍数开始,struct A有24字节,double有8字节,从3开始找8的倍数,数够24位;
char ch;//32 char类型只有1个字节,+1;
float m;//36--39 float从本身字节数的最小倍数开始;从33开始找4的倍数,float有4字节;
};
printf("%ld\n",sizeof(struct B));//struct B为40字节,32位机器得出的是32;