-
指针是什么?
我们知道cpu在处理数据的时候,所需要的数据都是从内存里面读取的,处理过后有会放回去,那是如何来实现这个操作的呢?其实就是通过地址,而我们的指针就是我们所说的地址,而指针变量则是存放地址的变量。但我们在叫法上常把指针变量叫做指针。所以现在我们知道了我们所说的指针其实是指针变量,是一个存放地址的变量。
-
指针的书写
书写格式为:数据类型 + * + 变量名
e.g. int * n ; (表示一个整形类型的指针变量)int a=10; int * p=&a; //这里表示一个整形指针变量p存放了整形a的地址
-
指针变量的大小
这个是非常值得一提的:指针变量的大小与其数据类型无关,都是一样的大小。
什么意思呢?举个例子吧:int * a 与double * b 他们两个的大小的一样的,与int double 无关。其实你可以把(int * ), (double* ) 看成一个整体,这个整体就是一个新的类型——指针类型,就好似所有的int 类型大小都是一样的,所有的double类型的大小都是一样的。
指针的大小在64位电脑上是8个字节,在32位电脑上是4个字节 -
指针的操作符( * )
注意这里的 * 可与int * n不一样,你可以理解为int * n中的 * 是一个定义,为了说明这个变量是一个指针变量。但这里的 * 我们把它叫做“解引用操作符”,它的作用是通过指针变量里存储的地址,来访问其地址上存放的值#include<stdio.h> int main() { int n=10; int* p=&n;//将n的地址保存在p printf("%d",*p); //解引用p,通过p中存放的n的地址来访问此地址存放的值,即10 return 0; }
-
指针类型
指针类型决定了指针进行解引用时访问几个字节,也就是说指针的类型代表了解引用时的访问权限:比如说char * 类型指针在解引用时只会访问一个字节,int * 类型指针则会访问四个字节
指针类型决定了指针在+1 or -1时移动多远:int * +1(向后移动4个字节,即一个整形的大小)char * -1(向前移动一个字节,即一个char的大小)
void * 指针:这是一个无具体类型的指针,可以去存放任意类型的指针,但它本身并不可以进行+、-、解引用( * )等操作
-
const修饰指针
const修饰变量
const int n =10; 表示n不再能被修改,获得了常量的性质,但其本质依然是变量,故而我们称为“常变量”const修饰指针
1. const 放在“ * ”的左边
int const * p = &a; 表示(* p)被修饰,p所指向的内容不可被修改,但p本身是可以被修改的
2.const放在“ * ”的右边
int * const p = &a;表示(p)被修饰,p本身不可被修改,但p所指向的内容可以被修改当然我们也可以在“ * ”的两侧都加上const,来进行双修饰
-
野指针
野指针指的是所指向的方向不可知(随机的、不正确的、没有任何限制的)
1. 创建一个指针变量时没有初始化
2. 指针越界
3. 指向的空间注销了没有初始化,即创建指针时指针被赋予了一个随机值(是很危险的),如果我们没有初始化,并且在后面的代码中使用了解引用相对其中的值进行修改,那可以会导致非常严重的后果。(例如:假如这个指针指向了计算机中一个非常关键的数据,然后我们将其修改之后,计算机可能就爆了),故而我们在初始化的时候应将其初始化,知道指向哪里我们就赋具体的地址,如果我们还不知道具体指向哪里我们就赋值为空(NULL)!
指针越界,我们就一个一维数组举例,arr[5]={1,2,3,4,5}; 指针的范围只能在这个数组范围内,一旦越出数组,指向的就是无效值
指向的空间注销了,举一个例子如下
#include<stdio.h> int* teat(void) { int n=10; int *s=&n; retrun s; } int main() { int * p=test(); return 0; }
我们可以看到,在函数test里创建了一个变量n,并且将n的地址存放到了s中,并将s返回存放到变量p中,但是!这里我们就要小心了,据我们所知,函数在执行玩后会自动销毁,也就是说当s变量返回放在变量p时,我们在函数里申请创建的int n 变量的空间已经被销毁!!!p指向了一个无效的值
关于指针(详解)
最新推荐文章于 2024-09-24 08:48:12 发布