指针
1、指针变量是用来存放地址的,用 * 定义。
地址:计算机中,数据都保存在内存中,像存在一个个小房间一样,地址就是小房间的门牌号,知道了门牌号,我们就可以直接找到对应的数据。
但由于计算机动辄是2的N次方的内存,如果用全二进制数字0/1来表示地址,那会不利于管理。所以发展为以字节为单位,即8个二进制数字0/1为一个小房间。
int a=10;
printf("%p\n",&a); //打印结果是 00 00 00 00 00 61 FE 0C(共8组)。
//一个字节是8个bit位,即2的8次方(256)个可能数据。
//16×16=256,8个bit位刚好可以用两位16进制数表示。
//上面的61、FE、0C就是分别用两位16进制数表示一个字节。
//64位数据是64个bit位,即2的64次方个可能数据。
//256^8=(2^8)^8=2^64,64个bit位刚好可以用8位256进制数表示,即8个字节。
//我的系统是64位,一次可以处理64位数据,这64位数据就可以用8个字节表示。
//这8个字节代表的数字就是 a 在内存中的地址,指针就是用来存放这个地址的。
//可以看出,地址就是用少量256进制数字表示大量2进制数字。
而指针就是用来存放房间号的。
有些数据规模比较大,一个小房间住不下,要占用多个小房间,指针只指向第一个房间号,也就是地址的首位字节。
由于指针中存放的是地址,则使用指针的时候,就是使用地址。可以理解为指针就是地址。
int a=4;
printf("%p\n",&a); //打印结果是00 00 00 00 00 61 FE 0C(共8组)。
int *b =&a; //定义指针 b ,&是取地址操作符,&a 代表 a 的地址。
printf("%p\n",b); //打印结果是00 00 00 00 00 61 FE 0C(共8组)。
*b =22; // *b=22 相当于a所在地址赋值22。
printf("%d\n",a); //打印结果是 22。
2、指针变量用 数据类型* 定义,这里的数据类型和要存放地址的数据类型相同。
数据类型* //定义指针变量
& //取地址操作符
%p //以地址的形式打印
* //解引用操作符
int a=2;
int *b=&a; //指针的定义格式是 数据类型*,即int*。这里b的int要和a前面相同。
//如下
char c='2';
char *d=&c; //这里 c 的数据类型是char,他的指针d定义就要用 char* 。
3、指针的大小取决于地址存储需要多大空间,在同一平台上是相同的。
int a=1;
int *b=&a;
printf("%d\n",sizeof(b)); //打印结果是8。
printf("%d\n",sizeof(int*)); //打印结果是8。
printf("%d\n",sizeof(char*)); //打印结果是8。
printf("%d\n",sizeof(float*)); //打印结果是8。
printf("%d\n",sizeof(short*)); //打印结果是8。
结构体
1、结构体可以让C语言创建新的数据类型,通过struct创建。
2、通过 . 可以选择结构体的变量。
3、结构体定义指针,可通过 *指针 解引用直接表示结构体。
4、结构体变量引用形式:结构体变量.成员变量 名(或结构体指针->成员变量名,此处 -> 等效于 .)
struct cup //新的数据类型 struct cup
{
char name[40]; //名字
int high; //高度
char color[20]; //颜色
float weight; //重量
}; //内含四种类型数据的结构体。
struct cup a={"高脚杯",15,"透明",9.3};
printf("1:%s %d %s %f\n",a.name,a.high,a.color,a.weight);
//打印结果 1:高脚杯 15 透明 9.300000。
//操作符 . 的使用方式是 结构体变量.成员变量 ,可调用内部数据。
struct cup *b =&a;
//结构体创建了新的数据类型 cup,使用指针时要用 struct cup * 。
printf("2:%s %d %s %f\n",(*b).name,(*b).high,(*b).color,(*b).weight);
//打印结果 2:高脚杯 15 透明 9.300000
//结构体可以通过 (*指针).成员变量 调用内部数据。
printf("3:%s %d %s %f\n",b->name,b->high,b->color,b->weight);
//打印结果 3:高脚杯 15 透明 9.300000
//结构体可以通过 指针->变量名 调用内部数据。