网站被取消备案,开发网站公司推荐,做玩游戏任务得q币的网站,dw个人网站制作十三#xff1a;指针变量
一#xff1a;数据类型
指针类型---------对应处理的数据是指针 (地址)这种数据
整型类型---------对应处理的数据是整数这种类型
二#xff1a;定义指针类型的变量
语法#xff1a; 基类型#xff08;1#xff09; *#xff08;…十三指针变量
一数据类型
指针类型---------对应处理的数据是指针 (地址)这种数据
整型类型---------对应处理的数据是整数这种类型
二定义指针类型的变量
语法 基类型1 *2 指针变量名3
1代表一个数据类型 //int/short/long/long long/char/float/double
//表示p中指针指向的内存空间上的数据类型
2定义指针变量时起到修饰没有*运算作用 //代表当前定义的不是普通变量而是一个指针类型的变量
3标识符 //符合标识符规则
egint *p 表示定义了一个指针类型的变量p代表一个指针类型的变量这个变量是要存放 指针类型的数据 (地址/内存单元编号)
int *p a //指向了a
p的数据类型去掉标识符剩下的就是其数据类型
答int* //p的数据类型指针类型表示这是指向int型数据的一类指针
三访问空间的流程
1.通过a-----访问直接访问
2.通过p------访问间接访问*//指针运算 *运算数必须是一个地址 *p -------- 表示对p进行指针运算
运算过程1.拿出p中的地址值到内存中定位 //通过p能找到a
2.从定位处开始向下偏移sizeof(基类型)大小的一块空间
3.将这块空间当做一个基类型数据或变量来看 //相当于是最终运算效果
*p 不单单是可以获取对应空间上的数据也可以修改效果上等价于a int a 10;int *p a;printf(a %d\n,a);//a 10printf(a %p\n,a);//a 0x7ffc988db62cprintf(p %p\n,p);//p 0x7ffc988db62cprintf(*p %d\n,*p);//*p 10//a 30;*p 30;//也可以通过指针来修改对应内存空间的值printf(a %d\n,a);//a 30printf(*p %d\n,*p);//*p 303.类型问题 int a 0x12345678;short *p a;//能放的下short *p (short *)a;//强制类型转换和上是一样的只是为了消除警告printf(*p %#X\n,*p);//*p 0X5678//从定位处开始向下偏移sizeof(基类型)大小的一块空间 a 是int型----------占4个字节—数据0x12345678
p short*指针类型-------p要指向的目标类型 是short类型
a //获得了一个地址值int*这种类型 因为我取了一块存放着int型数据的空间的地址 (a)
*p 64位系统指针类型为8字节 32位4字节
int isLitterEdian(void)//判断大小端
{unsigned int a 1;unsigned char *p (unsigned char *)a;return *p;
}int main(int argc, const char *argv[])
{(isLitterEdian() 1)?printf(isLitterEdian\n):printf(isBigEdian\n);return 0;四函数地址传递方式
1.被调修改主调
函数传参时必须传的是地址
被调函数中必须有对应的*p指针间接访问运算
应该用指针变量作为函数参数在函数执行过程中使指针变量所指向的变量值发生变化函数调用结束后这些变量值的变化依然保留下来
int addOne(int *n)
{*n *n 1;return *n;
}int main()int a 0;scanf(%d,a);printf(a %d\n,addOne(a));
void sumAndSub(int a,int b,int *sum,int *sub)
{*sum a b;*sub a - b;
}int main(int argc, const char *argv[])
{int a 0;int b 0;int sum,sub;scanf(%d %d,a,b);sumAndSub(a,b,sum,sub);printf(sum %d sub %d\n,sum,sub);int *ptr1,*ptr2 ptr1ptr2;
五NULL
1.NULL-----是一个指针 //0编号指针
#define NULL ((void*0) void*它的基类型为空(void)
//这个语句是将 ptr2 的地址值赋给 ptr1即 ptr1 和 ptr2 指向同一地址,合法
int *p NULL;//0 //此时不是野指针是一个明确的状态(空指针)
int *p;//p中是个随机值此时p指向的目标空间不明确 (野指针状态)十四指针数组
一.指针运算
1.算数运算
p1 //表示指向了下一个基类型相当于跳过了一个基类型)
//值的大小上相当于加了一个sizeof(基类型)
p //同上
p - q //p和q必须是同一类型的指针 //值的大小表示相差了几个基类型
指针不能做乘除运算
2.关系运算
! //看的是指针值的关系
二数组地址
1.只需要知道数组首元素的地址即可
a[0] //取首元素的地址 //地址值的数据类型是 int *
int* p a[0]; //数组名所代表的值就是首元素的地址
a //同上也是首元素的地址
int*p a//指针变量p 指向了数组 a
#includestdio.hvoid printfArr(int *a,int len)
{for(int i0;ilen;i){printf(%d ,*(ai));}putchar(\n);
}int main(int argc, const char *argv[])
{int a[] {1,2,3,4,5,6,7,8,9,10};int len sizeof(a)/sizeof(a[0]);printfArr(a,len);return 0;
}三指针的迭代
void printfArray(int *begin,int *end)
{while(begin end){printf(%d ,*begin);begin;}putchar(\n);
}int main(int argc, const char *argv[])
{int a[] {1,2,3,4,5,6,7,8,9,10};printfArray(a,a10-1);return 0;
}