C语言指针

指针知识点:

指针就是地址

指针变量: 存放地址的变量

指针的作用: 有了指针就可以访问它所指向的存储空间


定义指针

指针所指向数据类型* 指针变量名称

*的作用:

1: 在定义指针变量的时候,它是类型说明符,它说明定义的这个变量是一个指针变量

2; 如果不是 在定义指针的时候,它是一个操作符,用在指针变量前面访问指针所指向的存储空间


&作用:

1: 取地址符,取出变量的地址

*作为操作符的时候,它与&是一对反操作符


指针的初始化:

1: 先定义再初始化

int num = 10;

int* p;

p = #


p = 1000;  //错误

2: 定义的同时进行初始化

int* p2 = #

*p2 = # //错误   *在这里是一个操作符,是访问p2所指向的存储空间

指针的注意点

1、只有定义没有初始化的指针里面是垃圾值,也就是说它的指向是不确定的,称为野指针

2、如果访问一个野指针所指向的存储空间

2.1: 程序崩溃

2.2: 潜在的逻辑错误

3、我们不能给指针直接赋值一个整形数,因为内存是由操作系统管理的,我们不了解当前电脑中,那一块内存

是占用的,空闲的,所以内存是由操作系统分配的.

4、指针的指向是可以改变的

5、多个指针可以同时指向一个变量


指针作为函数的参数:

1、指针作为函数参数传递是 地址传递

1.1: 通过修改指针所指向的存储空间,才能修改主调函数中变量的值,如果仅仅修改指针本身,不影响 主调函数

2: 数组作为函数参数传递是 地址传递

3、基本数据类型作为函数传递是 值传递


指针的使用场景:

1、通过被调函数,修改主调函数中某个变量的值

2、让函数返回多个值



************************************************************************

多级指针:

二级指针: 指向一级指针的指针

int num = 10;

int* p = #

int** p = &p; //定义一个二级指针

**p = 20; //访问num

三级指针: 指向二级指针的指针


指针的运算:

算术运算: pointer代表指针,num 代表一个整形数


//pn + pn1 == (pn + pn1) / sizeof(指针指向的类型); 和指针指向数据类型的字节数有关

pointer + num 把指针向后移动num个它所指向的数据类型个单元

pointer - num 把指针向前移动num个它所指向的数据类型个单元


赋值运算:

pointer = &var;

pointer += num;

pointer  -= num;


关系运算(比较运算)

pointer1 == pointer2  pointer1 pointer2 指向同一个地址

ponter1 > pointer2 pointer1 的地址 > pointer2的地址

自增自减:

++pointer;

pointer++;

- - pointer;

pointer- -;



指针与一维数组:

1、数组像一个指针: 使用数组名访问数组中的元素,与使用指向这个数组的指针的访问其元素是等价的

int nums [] = {1,2,3,4};

int* pointer = nums;

nums[1] == pointer[1] == *(nums + 1) == *(pointer + 1);


2、数组不是一个指针

2.1:  sizeof(nums) != sizeof(pointer)

2.2: nums = &nums  pointer != &pointer

2.3: 指针的指向是可改变的,数组指向是不可改变的


指针与二维数组:

1、指针数组: 元素为指针的数组

格式:

指针类型     数组名称[指针的元素个数]  

比如:  int* ps[2]

2、数组指针: 数组的指针

指向一维数组的指针:  int (*pointer)[元素个数];

指向一维数组的指针 二维数组相对应

int nums[3][3] = { {1,2,3},{4,5,6},{7,8,9} }

pointer = nums;

pointer++; //此时指向4 它是加一个一维数组的长度

nums + 1 // 加的也是一个一维数组的长度


nums[1] + 1   // 它是加上一个一维数组元素的长度


const指针:

const在星号左边

修饰的是指针指向的内存

1. 指针可以改变指向

2. 不可以通过指针改变其所指向内存的值


const在星号的右边

修饰的是指针变量本身

1. 指针不可以改变指向

2. 可以通过指针改变其所指向内存的值


星号左边两边都有const

1. 指针不可以改变指向

2. 不可以通过指针改变其所指向内存的值


注意: 变量本身扔可以通过变量名去修改



函数指针: 指向函数的指针

定义指向函数的指针变量的格式为:

数据类型   (*指针变量名) (形参列表)


eg;

float (*p) (float x ,float y);

注意: 括号不能省略


float (*p) (int x , int y);定义了一个指向函数的指针变量

float* p (int x ,int y); 是一个返回值为指针类型的函数的声明



指向函数的指针变量的说明:

1: 把函数首地址赋给指针变量时,直接写函数名即可,不用写括号和函数参数

2: 利用指针变量调用函数时,要写明函数的实际参数


3: 函数指针的指向可以改变,但必须指向同类型的函数

同类型的函数:返回值类型和形参列表都相同


函数名和数组名一样.都是指针,函数名指向函数内存首地址




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值