指针的计算
指针中数据类型的作用:获取指针移动一次的字节个数,也就是一个步长的大小。
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;
printf("p的值为:%p\n", p); //p的值为:000000D9C330F994
p = p + 1;
printf("p的值为:%p\n", p);//p的值为:000000D9C330F998
return 0;
}
对应数据类型的步长(在Windows64位操作系统上)
char :1
short :2
int :4
long :4
long long :8
例如上面的代码,p存储变量a的地址,p向后移动一次,字节数向后加4,是指针数据类型对应的字节个数。同时,在进行减运算时代码雷同。在对指针进行乘除运算是无意义的,因为这时指针的指向不明。
通过获取地址进行运算得到数组中的数据
#include<stdio.h>
int main() {
int arr[] = { 52,8,96,3,5,2,3,6 };
//获取0索引的地址
int* p = &arr;
printf("%d\n", *p);//52
printf("%d\n", *(p + 1));//8
return 0;
}
计算数组中两个地址之间的间隔
#include<stdio.h>
int main() {
int arr[] = { 52,8,96,3,5,2,3,6 };
//获取0索引的地址
int* p = &arr;
printf("%d\n", *p);//52
printf("%d\n", *(p + 1));//8
//获取5索引的内存地址
int* p2 = &arr[5];
printf("p和p2间隔了多少个步长:%d\n", p2 - p);//5
return 0;
}
指向不明的指针
野指针:指针指向的空间未分配
#include<stdio.h>
int main() {
int a = 10;
int* p1 = &a;
printf("%p\n", p1);//000000041BFBF7D4
printf("%d\n", *p1);//10
//p2是野指针
int* p2 = p1 + 10;
printf("%p\n", p2);
printf("%d\n", *p2);//结果随机
return 0;
}
悬空指针:指针指向的空间已分配,但是被释放了
int* method();
int main() {
int* p3 = method();
printf("拖点时间\n");//拖点时间
printf("%p\n", p3);//0000007A620FFA24
printf("%d\n", *p3);//17错误
return 0;
}
//函数写在main函数之后要在main函数之前进行声明
int* method() {
int num = 10;
int* p = #
return p;
}
没有类型的指针
特殊类型:
void * p 不表示任何类型
特点:无法获取数据,无法计算,但是可以接收任意地址
函数:用来交换两个变量记录的数据
void swap(int* p1, int* p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
修改一下函数,更具有通用性
void swap(void* p1, void* p2, int len) {
//把void类型的指针,转成char类型的指针
char* pc1 = p1;
char* pc2 = p2;
char temp = 0;
//以字节为单位,一个字节一个字节的进行交换
for (int i = 0; i < len; i++) {
temp = *pc1;
*pc1 = *pc2;
*pc2 = temp;
pc1++;
pc2++;
}
}
int main() {
int a = 100;
int b = 300;
//调研汉书交换数据
swap(&a, &b, 4);
printf("交换后:%d %d\n", a, b);
return 0;
}
int main() {
//void类型的指针
//定义两个变量
int a = 10;
short b = 20;
//定义两个指针
int* p1 = &a;
short* p2 = &b;
//打印输出
printf("%d\n", *p1);//10
printf("%d\n", *p2);//20
//不同类型的指针之间是不能相互赋值的
//但是void没有任何类型,可以接收任意类型指针记录的内存地址
//void* p3 = p1;
//void* p4 = p2;
//缺点:void类型的指针,无法获取里面的数据,也不能进行加,减运算
//printf("%d\n",p3+1);这是错误写法
return 0;
}
C语言指针详解与应用
5034

被折叠的 条评论
为什么被折叠?



