通过对这一节的学习,了解了对指针的认识
1、为什么要用指针?
a.指针运行很快;指针接近与硬件,编译器更容易的把指针操作翻译为机器码呀,指针附带的开销更小
b.指针操作很直接;因为是直接去操作地址,那就可以直接访问地址里的值,就不用使用太多的变量透过函数层层传递
c.指针可以节约开销;因为不用使用多个变量相互传值,不用申请太多的临时变量,传递数据结构更节约
暂时我知道有这些;但很多优点其实都是从这个定义里给提取出来的。
2、指针是什么?
a.指针是一个变量;
b.指针变量里装的值是一个地址的值;
c.我们可以根据地址的值去找到那个地址的数据
3、大概怎么去用指针?
–由于C语言标准;只能先定义变量,才能使用变量;直白一些,先去申请,才能拿到空间资源
a.定义指针
b.给指针初始化
c.使用指针
C程序是在编译后,会以三种形式使用内存;
1、先谈谈C程序文件和编译后文件是什么?
我的理解:
C程序文件:文本文件;这是一个逻辑上处理数据的规范,里面定义了用什么来存储数据、计算数据等规则;
编译后文件:二进制文件;可以运行在操作系统上面,在启动这个二进制文件的时候,操作系统给这个二进制文件拷贝到内存里,变为一个进程,操作系统按照这个二进制文件里的信息,由操作系统分配内存资源(之前的定义变量啊,不同类型的变量需要大小也不一样的哈)给这个进程使用,然后就是这个进程自己运行,但受到操作系统的调度。
内存空间是由程序的变量来使用的
C语言程序文件使用三个大类的:
全局/静态内存:
由用户定义的全局变量、静态变量都分配在这里,全局变量是在程序运行时分配的,程序生命周期都可以使用这些变量,
所有函数都能访问全局变量,而静态变量就只能访问自己函数的作用域;
自动内存:
是函数内部声明的,在函数被调用时才分配,被调用的函数运行结束之后,由操作系统把这些空间给回收了;
动态内存:
是由用户自定义的主动申请空间,使用完成后必须要用户释放掉后,操作系统才能回收使用内存数据;作用域是由这个引用该内存的指针决定的;
作用域 | 生命周期 | |
---|---|---|
全局内存 | 整个程序文件 | 应用程序的整个生命周期 |
静态内存 | 声明它的函数内部 | 应用程序的整个生命周期 |
自动内存 | 声明它的函数内部 | 限制在函数的执行时间内 |
动态内存 | 由引用内存这个指针 | 申请开始—内存释放 |
指针是变量,是变量就有类型区分;
指针声明: 数据类型 *指针变量名
!这个 ‘ * ’ 的位置无关紧要哈,只要在数据类型和指针变量名之间就好了
#include
int main(void)
{
int *ptr1; //等价于后两种写法 int* ptr4; int* ptr4;
char *ptr2; //等价于后两种写法 char* ptr4; char* ptr4;
float *ptr3; //等价于后两种写法 float * ptr4; float* ptr4;
double *ptr4; //等价于后两种写法 double * ptr4; double* ptr4;
//.....等等类推
}
a.指针类型的确定是由 数据类型确定的
b.指针类型保证指向正确的数据类型对应的变量地址
b1. int类型 的指针 存储 int类型 的变量地址
b2. char类型 的指针 存储 char类型 的变量地址
b3. double类型 的指针 存储 double类型 的变量地址
方法:从右往左去读
例子:
int *ptr1; ptr1 是一个变量;
int *ptr1; *ptr1 是一个指针变量;
int *ptr1; int *ptr1 是一个指向int类型的指针变量;
测试一下:float *ptr1;
//答案
float *ptr1; ptr1 是一个变量;
float *ptr1; *ptr1 是一个指针变量;
float *ptr1; float *ptr1 是一个指向float类型的指针变量;
方法:使用‘ & ’(取地址符)
例子:
int number = 2;
int *ptr2;
int *ptr1 = &number; //初始化指针时就 赋值
ptr2 = &number; //先初始化再 赋值
方法:使用‘ * ’(取地址符)
例子:
int number = 2;
int *ptr1 = &number; //初始化指针时就 赋值
*ptr2 = number; //此时的 *ptr对应的地址
NULL其实是空,它的值是0,在指针初始化使用的时候可以赋值,那就意味着这个指针里的地址不是内存中的任何地址,也就是指针没有指向其他内存区域,NULL同时可以防止内存泄漏,防止指针去引用一些错误的地址
指针的概念还是很清晰的,指针就是存放地址的变量,指针是变量,存放的变量地址类型也必须是和指针类型一一匹配,指针可以进行透过地址去访问地址对应的值;
例如:我们可以通过ptr1指针去访问number的值,ptr1存放是number的地址:200,我们通过解引的方法;* ptr1 就能获取number的值, * ptr1 == number == 2