江苏工程建设标准网站,工地模板图片大全,seo人工智能,win8.1 做网站服务器正文开始之前#xff0c;我们要记住一个东西就是#xff1a;地址指针 目录 一、指针的解释二、指针变量和地址1、取地址操作符2、指针变量和解引用操作1、指针变量2、拆解指针类型3、解引用操作符4、注意事项 3、指针变量的大小4、指针的解引用5、void*指针 三、指针的运算1、…
正文开始之前我们要记住一个东西就是地址指针 目录 一、指针的解释二、指针变量和地址1、取地址操作符2、指针变量和解引用操作1、指针变量2、拆解指针类型3、解引用操作符4、注意事项 3、指针变量的大小4、指针的解引用5、void*指针 三、指针的运算1、指针±整数2、指针 - 指针3、指针的关系运算 四、野指针1、野指针形成的原因2、指针越界访问3、指针指向的空间释放 五、const 修饰指针1、const修饰变量2、const修饰指针变量 一、指针的解释
通俗来讲就是某一数据的位置。因为数据的存储是需要空间的这个空间会有一个地址指针就是用来存放这个地址的以便于后续快速的访问
二、指针变量和地址
1、取地址操作符
在C语⾔中创建变量就是向内存申请空间
#include stdio.h
int main()
{int a 10;return 0;
}我们在内存里可以看到在创建变量a的时候申请了一块空间 我们取地址a之后将地址四行显示发现a存储在了这个地址里0a就是十六进制下的10 这里我们介绍一下我们的老朋友操作符。在以前的学习中我们在学习scanf函数的时候接触过这个操作符这个操作符就叫做取地址操作符。 a取出的是a所占的四个字节中地址最小的字节的地址通过计算机的一套算法它懂得这个数据是整形会取出剩下的三个地址
这时候我们对scanf函数的理解也会深一个层次
scanf(%d,a);这里的a就是取出a的地址将里边的值进行修改
2、指针变量和解引用操作
1、指针变量
那我们通过取地址操作符()拿到的地址是⼀个数值这个数值有时候需要存储起来⽅便后期再使⽤我们会把这样的地址值存放在指针变量中。
#include stido.h
int main()
{int a 10;int *pa a;//这样就把取出的a的地址存放到指针pa中了return 0;
}指针变量也是变量专门用来存放地址存放在其中的值都会被认为是地址
2、拆解指针类型 int a 10;int *pa a;*说明pa是指针变量int 说明pa这个指针变量指向的是一个int类型也就是整型类型的对象 当然如果是short类型的对象那么就
short i 10;
short *pi i;char类型那么就
char j 10;
char * pj j;3、解引用操作符
#include stido.h
int main()
{int a 10;int *pa a;*pa 20;return 0;
}这样就把a的值更改为20了
4、注意事项
int*pa
int *pa
int* pa
int * pa这几个是一样的表达上没有任何的区别
3、指针变量的大小
#include stdio.h
int main()
{printf(%zd\n, sizeof(char *));printf(%zd\n, sizeof(short *));printf(%zd\n, sizeof(int *));printf(%zd\n, sizeof(double *));return 0;
}指针变量的大小取决于地址的大小指针变量的大小和类型是⽆关只要指针类型的变量在相同的平台下大小都是相同的
4、指针的解引用
#include stdio.h
int main()
{int n 0x12345678;int *pi n; *pi 0; printf(%d,n):return 0;
}#include stdio.h
int main()
{int n 0x12345678;char *pi (char*) n; //强制转化不然是不可以用char类型的指针来接受int类型的变量的*pi 0; printf(%d,n);return 0;
}第一个运行结果 第二个的运行结果 这说明char类型和int类型的访问权限不同char类型可以访问一个字节也就是十六进制下的两位数int类型可以访问四个字节也就是十六进制下的八位数
5、void*指针
⽆具体类型的指针也叫泛型指针可以接受任何类型的地址 但它不能够进行解引用操作以及指针±整数的运算下面来说
三、指针的运算
1、指针±整数
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p arr[0];int i 0;int sz sizeof(arr) / sizeof(arr[0]);for (i 0; i sz; i){printf(%d , *(p i));//pi 这⾥就是指针整数}return 0;
}这里的指针经过加减后是通过单位进行访问的也就是如果是int类型那么指针就加了四个字节char加一个字节short加两个字节。
2、指针 - 指针
#include stdio.h
int my_strlen(char* s)
{char* p s;while (*p ! \0)// \0 之前的元素为字符串中的元素p;return p - s;
}
int main()
{printf(%d\n, my_strlen(abc));return 0;
}这样就可以算出字符串中的元素个数
3、指针的关系运算
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p arr[0];int i 0;int sz sizeof(arr) / sizeof(arr[0]);while (p arr sz) //指针的⼤⼩⽐较{printf(%d , *p);p;}return 0;
}四、野指针
1、野指针形成的原因
#include stdio.h
int main()
{int* p;//局部变量指针未初始化默认为随机值*p 20;return 0;
}2、指针越界访问
#include stdio.h
int main()
{int arr[10] { 0 };int* p arr[0];int i 0;for (i 0; i 11; i){//当指针指向的范围超出数组arr的范围时p就是野指针*(p) i;}return 0;
}3、指针指向的空间释放
#include stdio.h
int* test()
{int n 100;return n;
}
int main()
{int* p test();printf(%d\n, *p);return 0;
}这些原因其实都很常见也很有规矩看一下就能看出来是理所应当的没啥需要解释的 想办法规避它们就行了
五、const 修饰指针
1、const修饰变量
#include stdio.h
int main()
{int m 0;m 20;//m是可以修改的const int n 0;n 20;//n是不能被修改的return 0;
}被const修饰的变量是不能修改的
2、const修饰指针变量
int * p;//没有const修饰
const int * p;//const 放在*的左边做修饰
int const * p;//const 放在*的左边做修饰
int * const p;//const 放在*的右边做修饰第二行和第三行实际是一样的。 我的理解是看const修饰的量被其修饰的量是不能改变的我们先来看第二行和第三行代码*p不能改变*p是变量值也就是指针指向的那个变量的内容它是不能够改变的但p也就是地址指针本身是可以改变的。 第四行代码const修饰p地址指针本身是不能改变的但指针指向的变量的内容是不能改变的
分享就到这了~