C语言基础之指针2
指针的计算
指针中数据类型的作用:获取指针移动一次的字节个数,也就是一个步长的大小。
#include<stdio.h>
int main()
{int a = 10;int* p = &a;printf("p的值为:%p\n", p); //p的值为:000000D9C330F994p = p + 1;printf("p的值为:%p\n", p);//p的值为:000000D9C330F998return 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);//52printf("%d\n", *(p + 1));//8return 0;
}
计算数组中两个地址之间的间隔
#include<stdio.h>
int main() {int arr[] = { 52,8,96,3,5,2,3,6 };//获取0索引的地址int* p = &arr;printf("%d\n", *p);//52printf("%d\n", *(p + 1));//8//获取5索引的内存地址int* p2 = &arr[5];printf("p和p2间隔了多少个步长:%d\n", p2 - p);//5return 0;
}
指向不明的指针
野指针:指针指向的空间未分配
#include<stdio.h>
int main() {int a = 10;int* p1 = &a;printf("%p\n", p1);//000000041BFBF7D4printf("%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);//0000007A620FFA24printf("%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);//10printf("%d\n", *p2);//20//不同类型的指针之间是不能相互赋值的//但是void没有任何类型,可以接收任意类型指针记录的内存地址//void* p3 = p1;//void* p4 = p2;//缺点:void类型的指针,无法获取里面的数据,也不能进行加,减运算//printf("%d\n",p3+1);这是错误写法return 0;
}