指针
指针:指针就是地址
指针变量:用来存放地址的变量就称为指针变量
定义格式:指针所指向的数据类型 * 指针变量名称
初始化:
1、先定义再初始化
int a = 10;
int *p;
p = &a;
2、定义的同时初始化
int *p = &a;
注意点:
1、没有初始化的指针不可访问它所指向的存储空间,因为它(指针变量)里面是垃圾值,所以它指向是不确定
1、程序崩溃
2、访问了不该访问存储空间
2、不可以把一个常量直接复制指针变量,因为你不知道这个地址编号代表那个存储空间
3、指针的指向是可以改变
4、多个指针可以指向同一地址
指针与函数
1、基本数据类型作为函数参数传递是值传递
2、指针作为函数参数传递是地址传递(通过指针可以访问它所指向存储空间)
指针为什么要区分类型(了解)
1、指针里面存储仅仅是一个字节的地址,如果没有数据类型,那么当使用指针去访问它所指向的存储空间的时候,就不知道要取出多个字节;数据类型就是告诉指针取出多个字节
2、进行指针运算的时候也需要使用指针所指向的数据类型
指针与数组(了解)
1、数组像一个指针
int nums[] = {1,2,3,4,5};
int *p = nums;
num[1] == *(num+1) == *(p + 1) == p[1]
1、我们可以通过访问指针所指向的存储空间的方式去访问数组中元素
我们也可通过使用数组放其元素的方式,来使用指针访问其元素
2、数组不是一个指针
1、sizeof(array)!= sizeof(pointer)
当把一个数组赋值给一个指针变量,那么我们没有办法通过指针变量来获取数组的长度信息,此时我们称为指针信息遗失
2、array == &array 数组名就是数组的地址
pointer != &pointer 指针变量变量里面所存放地址不是指针本身地址
3、指针的指向是可以改变的,数组的指向的是不可以改变的
3、指针运算(了解)
pointer + n 访问pointer后面的第n元素
pointer - n 访问pointer前面的第n元素
pointer1 - pointer 两个指针地址之间有多少个元素
4、多级指针
二级指针:指针一级指针的指针
int **pp = &p;
三级指针:指向二级指针的指针
int ***ppp = &pp;
指针与字符串函数啥的
1、指针的基本概念
指针:指针就是地址(内存中字节地址的编号)
指针变量:存储放地址变量,通常我们指针变量称为指针
指针作用:
1、共享数据
2、以传递地址代替传递值的拷贝
定义格式:
指针所指向数据类型 *指针变量名称
*作用:
1、在定义变量的时候,它是说明符,说明所定义的变量是一个指针变量
2、在非定义的变量的时候,它是操作符,访问(读、写)指针所指向的存储空间
&作用:
1、作为单目操作符,它是取出变量的地址
2、指针变量初始化多种方式
1、先定义在初始化
int a = 10
int *p;
p = &a;
2、定义同时初始化
int *p = &a;
注意点:
1、指针没有初始化不可以访问它所指向存储空间,因为没有初始化的指针里面是一个垃圾值,此时我们称这个指针是野指针
1、程序崩溃
2、访问不该访问存储空间
2、指针不可以直接赋值一个数值,因为你不知道这个数值代表着内存中那个存储区域
3、指针的指向是可以改变的
4、多个指针可以指向同一地址
指针与函数
1、指针作为函数参数传递是地址传递(只要知道一个变量的地址,无论在哪里都可以访问它的存储空间)
2、指针作为函数的返回值(指针函数)
1、局部变量的地址不可以作为函数的返回值
2、常量的地址可以作为函数的返回值
3、堆中的地址可以作为函数的返回值
内存分区,从大地址到小地址
1、栈:用于存放局部变量的,可读可写,系统自动释放存储空间
2、堆:在C语言中,通过malloc函数开辟的存储空间是在堆里的,手动释放,只要有一个 malloc 就必须对应有一个free,可读可写
3、全局区:用来存放全局变量的,可读可写
4、常量区:用来存放常量的,只读的
5、代码区:用来存放代码的,只读的
函数指针:指向函数的指针
定义函数指针:
1、是变量就要有变量名称
2、是指针就必须有一个 *
3、如果是函数指针就要把它们用小括号括起来
4、把函数的左边拷贝它左边
5、把函数的右边拷贝它右边
6、形参名称是可以省略的
int sum(int a,int b);
//
int (*pointer)(int,int) = sum;
int result = pointer(10,20);//通常使用是这种方式
int result = (*pointer)(10,20);
指针:指针就是地址
指针变量:用来存放地址的变量就称为指针变量
定义格式:指针所指向的数据类型 * 指针变量名称
初始化:
1、先定义再初始化
int a = 10;
int *p;
p = &a;
2、定义的同时初始化
int *p = &a;
注意点:
1、没有初始化的指针不可访问它所指向的存储空间,因为它(指针变量)里面是垃圾值,所以它指向是不确定
1、程序崩溃
2、访问了不该访问存储空间
2、不可以把一个常量直接复制指针变量,因为你不知道这个地址编号代表那个存储空间
3、指针的指向是可以改变
4、多个指针可以指向同一地址
指针与函数
1、基本数据类型作为函数参数传递是值传递
2、指针作为函数参数传递是地址传递(通过指针可以访问它所指向存储空间)
指针为什么要区分类型(了解)
1、指针里面存储仅仅是一个字节的地址,如果没有数据类型,那么当使用指针去访问它所指向的存储空间的时候,就不知道要取出多个字节;数据类型就是告诉指针取出多个字节
2、进行指针运算的时候也需要使用指针所指向的数据类型
指针与数组(了解)
1、数组像一个指针
int nums[] = {1,2,3,4,5};
int *p = nums;
num[1] == *(num+1) == *(p + 1) == p[1]
1、我们可以通过访问指针所指向的存储空间的方式去访问数组中元素
我们也可通过使用数组放其元素的方式,来使用指针访问其元素
2、数组不是一个指针
1、sizeof(array)!= sizeof(pointer)
当把一个数组赋值给一个指针变量,那么我们没有办法通过指针变量来获取数组的长度信息,此时我们称为指针信息遗失
2、array == &array 数组名就是数组的地址
pointer != &pointer 指针变量变量里面所存放地址不是指针本身地址
3、指针的指向是可以改变的,数组的指向的是不可以改变的
3、指针运算(了解)
pointer + n 访问pointer后面的第n元素
pointer - n 访问pointer前面的第n元素
pointer1 - pointer 两个指针地址之间有多少个元素
4、多级指针
二级指针:指针一级指针的指针
int **pp = &p;
三级指针:指向二级指针的指针
int ***ppp = &pp;
指针与字符串函数啥的
1、指针的基本概念
指针:指针就是地址(内存中字节地址的编号)
指针变量:存储放地址变量,通常我们指针变量称为指针
指针作用:
1、共享数据
2、以传递地址代替传递值的拷贝
定义格式:
指针所指向数据类型 *指针变量名称
*作用:
1、在定义变量的时候,它是说明符,说明所定义的变量是一个指针变量
2、在非定义的变量的时候,它是操作符,访问(读、写)指针所指向的存储空间
&作用:
1、作为单目操作符,它是取出变量的地址
2、指针变量初始化多种方式
1、先定义在初始化
int a = 10
int *p;
p = &a;
2、定义同时初始化
int *p = &a;
注意点:
1、指针没有初始化不可以访问它所指向存储空间,因为没有初始化的指针里面是一个垃圾值,此时我们称这个指针是野指针
1、程序崩溃
2、访问不该访问存储空间
2、指针不可以直接赋值一个数值,因为你不知道这个数值代表着内存中那个存储区域
3、指针的指向是可以改变的
4、多个指针可以指向同一地址
指针与函数
1、指针作为函数参数传递是地址传递(只要知道一个变量的地址,无论在哪里都可以访问它的存储空间)
2、指针作为函数的返回值(指针函数)
1、局部变量的地址不可以作为函数的返回值
2、常量的地址可以作为函数的返回值
3、堆中的地址可以作为函数的返回值
内存分区,从大地址到小地址
1、栈:用于存放局部变量的,可读可写,系统自动释放存储空间
2、堆:在C语言中,通过malloc函数开辟的存储空间是在堆里的,手动释放,只要有一个 malloc 就必须对应有一个free,可读可写
3、全局区:用来存放全局变量的,可读可写
4、常量区:用来存放常量的,只读的
5、代码区:用来存放代码的,只读的
函数指针:指向函数的指针
定义函数指针:
1、是变量就要有变量名称
2、是指针就必须有一个 *
3、如果是函数指针就要把它们用小括号括起来
4、把函数的左边拷贝它左边
5、把函数的右边拷贝它右边
6、形参名称是可以省略的
int sum(int a,int b);
//
int (*pointer)(int,int) = sum;
int result = pointer(10,20);//通常使用是这种方式
int result = (*pointer)(10,20);