指针

首先明白内存是以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:   

->结构成员操作符

[] 下标引用操作符

() 函数调用操作符