C语言——初阶指针

目录

一.指针是什么

二.指针与指针类型

2.1 指针+-整数

2.2 指针的解引用

三.野指针

3.1 野指针成因

3.2 如何规避野指针

四.指针运算

4.1指针+-整数

4.2指针-指针

4.3指针的关系运算

​编辑

五.指针与数组

六.二级指针

七.指针数组


一.指针是什么

 

 *说明pa是指针变量,int说明pa指向的a的类型是Int

 

生成的地址作为一个内存单元的编号。一共有2^23次方个地址,设一个地址为一个字节,那么就有2^23次方个字节(4GB)。

 

 

二.指针与指针类型

int num = 0;
int* num = #

 

2.1 指针+-整数

  当我们打印两者的地址时,发现没有区别。

现在给它们都加上1,发现就出现不同了。

 

在数组中,我们同样可以通过不同的指针类型来进行访问的位置。

 

2.2 指针的解引用

原本a放的是44 33 22 11,但是通过解引用后全部变为0.

当我们尝试把指向a的变量类型改成char时,a的数据存放发生了变化——只改了4个字节中的一个字节。

三.野指针

3.1 野指针成因

1.指针未初始化。

2.指针越界,当访问第11个字节的时候,这是不属于数组的,自然也不能修改。

3.指针指向的空间被释放

虽然最后是取到了a的地址,但是函数一结束栈空间就销毁了,那么这跟未初始化一个道理。

3.2 如何规避野指针

 

 程序会报错:

  所以要避免在NULL时对其修改。

四.指针运算

4.1指针+-整数

不管怎么变,其本质都是一个地址加上偏移量。

4.2指针-指针

依次循环,把values数组中的5个元素都变成0.

 

指针-指针还可以应用于计算数组元素个数: 

 

4.3指针的关系运算

#define N_VALUES 5
float values[N_VALUES];
float * vp;
for(vp=&values[N_VALUES];vp>&values[0];)
{
    *--vp=0;
}

 

就是说可以从左往右比,但不建议从右往左比。 

 

 

五.指针与数组

 

 

&arr+1会跳过40个字节,也就是整个数组。

 

 注意,数组名不能++因为它是一个地址,是一个常量。而p可以++,因为它是一个指针变量。

六.二级指针

p与pp都是指针变量,而int * *是类型。

*表示p是指针,而int表示p所指向的类型。

同理*表示pp是指针变量,而int *是说明pp指向的变量的类型是int*。

 pp前面加个*,可以找到并修改p,如果再加一个*,那么就是可以找到并修改a。

七.指针数组

 

 

 

猜你喜欢

转载自blog.csdn.net/fax_player/article/details/132358882
今日推荐