1. 指针
- 两种用法:1. 用来存放别人的地址; 2. 通过 *P 找到所指向的对象,来操作所指向的对象。
1.1 内存——与现实中空间的使用十分类似
- 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
- 为了有效的使用内存,就把内存划分成一个个的内存单元,每个内存单元的大小是1个字节。
- 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
打印变量地址:
//打印变量地址
#include <stdio.h>
int main()
{
int num = 10; //num在内存中分配的空间为4个字节
char ch = 'h';
printf("%p\n", &num); //%p是专门用来打印地址的
printf("%p\n", &ch);
int* Pa = # //P是用来存放地址的,在c语言中叫做指针变量
char* Pb = &ch; //*说明P是指针变量,int说明P执行的对象是int类型的
return 0; //取出num的地址,
}
/*输出结果为:00BBFCBC
00BBFCB3*/
通过 *P 找到所指向的对象,来操作所指向的对象:
//通过 *P 找到所指向的对象,来操作所指向的对象
#include <stdio.h>
int main()
{
int a = 10;
float b = 3.14;
int* P = &a;
float* Pa = &b;
*P = 20; //这里的*P叫做解引用操作,*P就是通过P的地址找到a
*Pa = 5.14;
printf("%d\n", a);
printf("%f\n", b);
return 0;
} /*输出结果为:20
5.140000*/
1.2 指针变量的大小
-
指针的大小与地址线的多少有关,而地址线由于32位、64位平台有关
- 32位——32根地址线——物理线——通电——1/0的二进制序列 (电信号转换成数字信息);64位——64根地址线——物理线——通电——1/0的二进制序列 (电信号转换成数字信息)。
- 指针变量的大小取决于地址的大小——因为指针是用来存放地址的指针需要多大空间取决于地址的存储需要多大空间。
- 32位平台下地址是32个bit位(即4个字节);64位平台下地址是64个bit位(即8个字节)。
//计算指针变量的大小
#include <stdio.h>
int main()
{
printf("%d ", sizeof(char*));
printf("%d ", sizeof(short*));
printf("%d ", sizeof(int*));
printf("%d ", sizeof(double*));
printf("%d ", sizeof(long*));
printf("%d ", sizeof(long long*));
printf("%d ", sizeof(float*));
printf("%d ", sizeof(double*));
return 0;
} //32位系统输出结果为:4 4 4 4 4 4 4 4
//64位系统输出结果为:8 8 8 8 8 8 8 8
2. 结构体
- 结构体使得C语言有能力描述复杂类型。
- 结构体可以让C语言创建新的类型出来。
例:描述学生,包含 名字+年龄+性别+学号+成绩 几项信息:
//结构体的初始化
#include <stdio.h>
struct Stu //stu为结构体变量
{
char name[20]; //名字,为字符数字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
double score; //成绩 以上5项为成员变量
};
int main()
{
//.为结构成员访问操作符
struct Stu s = { "李明", 20, "男", "2209699710", 90.4 }; //结构体的创建和初始化
printf("1:name=%s age=%d sex=%s id=%s score=%f\n", s.name, s.age, s.sex, s.id, s.score); //结构体变量.成员变量
//->操作符——功能与(*P)相同
struct Stu* Ps = &s;
printf("2:name=%s age=%d sex=%s id=%s score=%f\n", Ps->name, Ps->age, Ps->sex, Ps->id, Ps->score); //结构体指针->成员变量名
printf("3:name=%s age=%d sex=%s id=%s score=%f\n", (*Ps).name, (*Ps).age, (*Ps).sex, (*Ps).id, (*Ps).score);
return 0;
} /*输出结果为:1:name = 李明 age = 20 sex = 男 id = 2209699710 score = 90.400000
2:name = 李明 age = 20 sex = 男 id = 2209699710 score = 90.400000
3:name = 李明 age = 20 sex = 男 id = 2209699710 score = 90.400000*/