1.1指针的重要性
内存是可以被CPU直接访问的,硬盘不行主要靠地址总线,数据总线,控制总线
具体的总线的解释 来自于博客园 Copyright © zhliao
1.2指针的定义
1.2.1地址:
地址就是内存单元的编号
从0开始的非负整数
范围:0–FFFFFFFF[0-4G-1](地址线是32位,刚好控制2的32次)
1.2.2指针:
指针就是地址 地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数(不能加乘除,只能减)
int * p;//p表示指针变量名,int*表示p变量只能是存放int类型的变量的地址
int i=6;
p=&i;//p指向i
*p=10;//含义:*p就等价于i
注意:1.指针变量也是变量,只不过它存放的不能是内存单元的内容,只能存放内存单元地址的内容
2.所有的指针变量只占4个字节,用第一个字节的地址表示整个变量的地址
1.3指针与数组
数组名是存放了第一个数组的第一个字节的地址
代码如下
#include<stdio.h>
int main(void)
{
double * p;
double x = 44.3;
p = &x;//x占了8个字节 1个字节是8位 一个字节代表一个地址
double arr[3] = { 1.1,1.2,1.3 };
double *q;
q = &arr[0];
printf("%p\n", q);//%p是十六进制输出
p = &arr[1];
printf("%p\n", p);
return 0;
}
讲解:
输出结果:
解释原因(q和p相差8位):
总结:
1.4结构体
1.4.1.结构的出现的目的:为了表示一些复杂的数据,而普通的基本类型变量无法满足要求
1.4.2结构体的定义:结构体是用户根据实际需要自己定义的复合数据类型
1.4.3使用结构体
#include<stdio.h>
#include<string.h>
struct Student
{
int sid;
int sage;
char name[200];
};
void SetValue(struct Student *pst);
int main(void)
{
//-------------第一种方法赋值----------------
/*struct Student st = {34,34,"ll"};
strcpy_s(st.name, "yanlei");
st.sage = 20;
st.sid = 12;
printf("%s %d %d\n", st.name, st.sage, st.sid);*/
//-------------第二种方法赋值----------------
/*struct Student st;//分配了内存空间,只是得到的是一个垃圾数据,随机的
struct Student *pst = &st;
strcpy_s(pst->name, "yanglei");
pst->sage = 88;
pst->sid = 77;
printf("%s %d %d\n", st.name, st.sage, st.sid);*/
//--------------函数进行赋值-----------------
struct Student st;
SetValue(&st);
return 0;
}
void SetValue(struct Student *pst)
{
strcpy_s(pst->name, "yanglei");
pst->sage = 22;
pst->sid = 111;
printf("%s %d %d\n", pst->name, pst->sage, pst->sid);
}
注意事项:
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数参数的传递