C语言——初阶指针

简介: C语言——初阶指针



一.指针是什么

*说明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。

 

 

七.指针数组

 

相关文章
|
1天前
|
搜索推荐 程序员 C语言
指针赋值与引用传递:C语言的基础知识与实践技巧
指针赋值与引用传递:C语言的基础知识与实践技巧
|
4天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
11 0
|
4天前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调
6 0
|
4天前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
6 0
|
4天前
|
存储 C语言
C语言数组指针详解与应用
C语言数组指针详解与应用
10 0
|
4天前
|
存储 C语言
C语言中的指针
C语言中的指针
10 0
|
5天前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
5天前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
5天前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
22小时前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数