1.指针的概念
指针变量也是一个变量 。
指针存放的内容是一个地址,该地址指向一块内存空间 。
指针是一种数据类型 。
指针在内存中的大小:
所有的指针地址编号在32位系统下是一个4字节的无符号整数,在64位系统下是8字节的无符号整数 。
下面通过代码简单介绍:
#includeint main01(){ int* p;//定义了一个可以执行int类型地址的指针变量,叫p int a;//定义了一个int型的变量,叫a a = 1; p = &a;//将a的内存地址赋值给p printf("%pn", p); *p = 10;//通过指针变量间接访问a的值,*p代表指针指向变量的值,p代表变量地址 printf("%dn", a); a = 100; printf("%dn", *p); int b = 2; p = &b;//p指向b的地址*p = 20; printf("%dn", b); char* p1 = &a;//两个类型不同的地址,会导致值出错 a = 123456; *p1 = 0; printf("a=%dn", a); void* p2;//可以指向任何类型地址,void代表无类型 return 0;}
2.空指针和野指针
空指针就是指向了NULL的指针变量 。
野指针,没有指向任何有效地址的指针变量,所以代码中避免出现野指针,如果一个指针不能确定指向任何一个变量的地址,那么就将这个指针变为空指针 。
#includeint main0201()//指针在内存中的大小是固定的{ char* p1; int* p2; long long* p3; printf("%lu,%lu,%lun", sizeof(p1), sizeof(p2), sizeof(p3)); return 0;}//NULL在C语言中是一个宏常量,值是0.int main0202()//野指针和空指针{ //int* p;//未初始化过值的指针,是野指针 //*p = 100; int* p; p = NULL;//如果一个指针变量没有明确指向一块内存,那就把这个变量指向NULL return 0;}
3.const与指针之间的关系
const修饰谁,谁的值就不能改变
#includeint main0301()//指向常量的指针{ int a = 5; const int* p = &a;//const修饰*p,则*p不可修改 //*p = 10;err printf("%dn", a); const int b = 11; //b = 0;err 不可修改 int *p1;//通过修改指针指向内存地址中的值,达到修改常量的值 p1 = &b; *p1 = 0; printf("%dn", b); return 0;}int main0302()//常量指针{ int a = 10; int b = 20; int* const p2 = &a; //p2 = &b;//err不能修改指针常量指向的内存地址 *p2 = 20;//但可以修改内存地址中的值 printf("%d", a);}
4.指针与数组的关系
#includeint main0401(){ int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p; //p = a; p = &a[2];//此时p[0]指向a[2],p[1]指向a[3] p[3] = 20;//当指针变量指向一个数组时,C语言规定指针变量名可当数组名使用 printf("%lu,%lun", sizeof(a), sizeof(p)); for (int i = 0; i < 10; i++) {printf("a[%d]=%dn", i, a[i]); } return 0;}int main0402(){ int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = a;//指针指向a首地址 p[3] = 100;//即 *(p+3)=100 for (int i = 0; i < 10; i++) {printf("a[%d]=%dn", i, a[i]); } return 0;}
5.指针的运算
赋值:int *p=&a;
求值:int i=*p;
取指针地址:int **pp=&p;
将一个整数加(减)给指针:p+3; p-3;
增加(减少)指针值p++,p—
求差值p1-p2通常用于同一个数组内求两个元素之间的距离
比较p1==p2通常用来比较两个指针是否指向同一个位置 。
#includeint main0501()//指针运算不能有乘除{ //long a = 0; //long* p = &a;// printf("%p,%p,%pn", p, p + 1, p + 2); int a[10] = { 0 }; int* p = a; p += 5; *p = 1; p -= 2; *p = 3;// *p= 2;//err for (int i = 0; i < 10; i++) {printf("a[%d]=%dn", i, a[i]); } return 0;}//指针变量可计算,int* +1,变化4个整数,char* +1,变化一个整数//C语言中所有数据类型都可看做为一个char的数组int main0502()//用char修改一个int类型的地址{ int a = 0x12345678;//int是4个char故p[0]=0 将a的末尾两位78改为0 char* p = (char*)&a; p[3] = 0; printf("%xn", a); printf("----------------------n"); char b[20] = { 0 }; int* p1 = (int*)b; p1[3] = 0x12345678;//位移了char中的12个字节,因为p1是int型 for (int i = 0; i < 20; i++) {printf("b[%d]=%xn", i, b[i]); } return 0;}
6.利用指针给二维数组排序
#define _CRT_SECURE_NO_WARNINGS#includeint main0701(){ char a[2][5] = { {1,4,3,2,5} ,{9,7,6,8,10} }; char* p = &a; for (int i = 0; i < 10-1; i++) {for (int j = 0; j < 10 - i - 1;j++){if (p[j] > p[j + 1]){char temp = p[j];p[j] = p[j + 1];p[j + 1] = temp;}} } for (int i = 0; i < 2; i++) {for (int j = 0; j < 5; j++){printf("a[%d][%d]=%dn", i, j, a[i][j]);} } return 0;}
【C语言中指针的详细使用 C语言中指针函数的用法】7.指针数组
#define _CRT_SECURE_NO_WARNINGS#include//地址编号在32位系统下是4字节,在64位系统下是8字节int main0801(){ char* a[10]; int* b[10]; printf("%lu,%lun", sizeof(a), sizeof(b)); int i = 0; //a = &i;//erra是数组名是常量,不是指针 a[0] = &i;//OK printf("%lu,%lun", sizeof(b[0]),sizeof(*b[0])); return 0;}int main0802(){ int* arr[10] = { NULL }; int a, b, c; arr[0] = &a; arr[1] = &b; arr[2] = &c; *arr[0] = 10; printf("%dn", a); return 0;}
- 幼儿园大班到一年级语文拼音阅读的过渡 一年级语文拼音阅读训练(人教版)
- 这4种坚果要多吃 什么坚果吃了好处多
- 实用性很强的英语课堂小游戏 好用的英语课堂游戏
- 体验国产天语这款升降摄像头手机 升降摄像头的手机
- 500ml白酒就是1斤酒 500ml酒等于一斤吗
- 为什么英语地位高 英语的为什么
- 学习英语真的有用吗 学英语有用吗?
- 势不可挡的成语含义 势不可挡词语解释
- 成语气冲斗牛的典故 什么是气冲斗牛
- 对于郑州中考外语系套餐的一些看法