指针
首先明白内存是以byte为单位划分内存单元的,每个内存单元都有一个编号,通过调试监视窗口可以发现内存地址中存放的数据,数据通过编码的形式存放在内存地址单元中。
以下代码展示了申明变量,申请内存的过程,通过找到变量的地址来分析变量的内容:
int main()
{
int a = 10; //向内存申请4个字节,存储10
printf("%p\n", &a); // %p【以地址的格式来打印数据】
return 0;
}
申明指针变量:
指针变量是用来存放地址的,指针变量的大小取决于一个地址存放的时候需要多大空间
32位机器上的地址,32bit位,所以指针变量的大小是4个字节。
64位机器上的地址,64bit位,所以指针变量的大小是8个字节。
int * p = &a; //p就是指针变量
//*p = 20; *是“解引用操作符”,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象
//个人理解*是取内容符,*p即表示取p中的内容
结构体
结构体使C语言有能力描述复杂类型,是把单一类型组合在一起的做法,例:
struct stu //结构体名称
{
char name[10];
int age;
char sex[4];
char id[15];
};
int main()
{
struct stu hi = { "tr","32","man","187114995" }; //结构体变量初始化
printf("%s %d %s %s\n", hi.name, hi.age, hi.sex, hi.id); //通过.s的方式引用结构体成员
return 0;
}
还可以通过定义结构体类型指针变量,通过指针的方式引用结构体成员:
#include <stdio.h>
struct stu //结构体名称
{
char name[10];
int age;
char sex[4];
char id[15];
};
void print(struct stu* ps) //申明函数print,使用结构体类型指针变量ps作为参数
{
printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).id); //一种调用参数的写法
printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->id); //一种调用参数的写法
}
int main()
{
struct stu hi = { "tr","32","man","187114995" }; //结构体变量初始化
/*printf("%s %d %s %s\n", hi.name, hi.age, hi.sex, hi.id);*/
print(&hi); //将结构体变量hi的地址传给指针ps
return 0;
}
tips:
->结构成员操作符
[] 下标引用操作符
() 函数调用操作符