计算机的内存中有许许多多的储存单元(大小为一个字节),这些储存单元都被进行了编号,每个储存单元都有唯一的编号,称之为储存单元的地址。
8bit(位) = 1byte(字节) 1024字节 = 1KB(千字节) 1024KB = 1MB(兆字节) 1024MB = 1GB 1024GB = 1TB 1024TB = 1PB 2^10 = 1024
如何知道一个变量的地址呢?答案是取地址操作符&
,可以取出变量的、函数的地址。
#include <stdio.h>
int main(){
int a = 1;
printf("%p\n", &a);
return 0;
}
取出变量a
的地址,这个地址是随机分配的,所以每次运行程序得到的地址也不一定相同。
格式:数据类型 *
变量名
int a = 5;
int *p1 = NULL;
//p1是一个指针,指向int类型的数据
p1 = &a;
double b = 4.6;
//p2是一个指针,指向一个double类型的数据
double* p2 = &b;
以指向int类型的指针为例
指针变量可以指向一个变量的地址,如何通过指针变量影响(改变)指向的变量的值呢?通过解引用操作符*
可以实现。
#include <stdio.h>
int main(){
int a = 0;
int *p = &a;
//解引用操作符,此时*p等价于a
*p = 10;
printf("%d\n", *p);
return 0;
}
指针存放的是地址,所以指针变量的大小是地址的大小。 32位平台上(32个bit)大小是四字节,64位平台上(64个bit)大小是八字节。
C语言除了有基本的数据类型外,还可以借助struct
自定义数据类型,用来描述复杂的对象。
比如描述一个学生,需要姓名、学号、班级、成绩、身份证号等信息。
//一个学生所具有的基本信息
struct student{
char name[10];
char num[20];
int class;
int score;
char id[20];
};
此时struct student
就是一个自定义的数据类型,用法与char
、int
等数据类型基本相同。
假设已经定义了struct student
的数据类型
struct student a = {"xiaozhang","10001",1,95,"41XXXXXXXXXXXXXX"};
.
访问一个结构体中的单个成员。#include <stdio.h>
struct student{
char name[10];
char num[20];
int class;
int score;
char id[20];
};
int main(){
struct student a = {"xiaozhang","10001",1,95,"41XXXXXXXXXXXXXX"};
printf("%s %s %d %d %s", a.name, a.num, a.class, a.score, a.id);
return 0;
}
运行结果:
->
访问结构体的单个成员,前提是一个结构体指针。#include <stdio.h>
struct student{
char name[10];
char num[20];
int class;
int score;
char id[20];
};
int main(){
struct student a = {"xiaozhang","10001",1,95,"41XXXXXXXXXXXXXX"};
//这是一个指针,指向一个结构体变量
struct student *p = &a;
printf("%s %s %d %d %s", p->name, p->num, p->class, p->score, p->id);
return 0;
}
运行结果:
END