当前位置: 首页 > news >正文

C语言笔记20

指针运算


#include <stdio.h>int main()
{char ac[] = {0,1,2,3,4,5,6,7,8,9,};char *p = ac;printf("p =%p\n", p);printf("p+1=%p\n", p+1);int ai[] = {0,1,2,3,4,5,6,7,8,9,};int *q = ai;printf("q =%p\n", q);printf("q+1=%p\n", q+1);return 0;
}

result:

  • p =0xbffbad5a
  • p+1=0xbffbad5b
  • q =0xbffbad2c
  • q+1=0xbffbad30

sizeof(char)=1;sizeof(int)=4,

给指针加1表示要让指针指向下一个变量

如果指针不是指像一片连续分配的空间(如数组),这种运算就没有意义

还可以对指针做的算术运算:

给指针加、减一个整数(+ += - -=)

递增递减(++ --)

两个指针相减(结果是两地址的差除以sizeof内的类型)

*p++

取出p的那个数据来,并将p移到下一个位置去

*的优先级低于++

常用于数组类的连续空间操作

在某些CPU上,还可以直接被编译成一条汇编指令

char ac[] = {0,1,2,3,4,5,6,7,8,9,-1};

char *p = &ac[0];

int i;

法一:for ( i=0; i<sizeof(ac)/sizeof(ac[0]); i++ ) {

                printf("%d\n", ac[i]);

           }

法二:while ( *p != -1 ) {        //for ( p=ac; *p=-1; ) {

                printf("%d\n", *p++);

            }

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

            int *p = ai;

指针比较

< <= == > >= !=都可以对指针做,比较它们在内存中的地址

数组中单元的地址肯定是线性递增的



0地址

内存中有0地址,但0地址通常是个不能随便碰的地址,所以指针不应该具有0值

因此可以用0地址来表示特殊的事情:

  • 返回指针是无效的
  • 指针没有被真正初始化(先初始化为0)

NULL是一个预定义的符号,表示0地址

指针的类型

无论指向什么类型,所有的指针的大小都是一样的,因为都是地址,但是指向不同类型的指针是不能直接互相赋值的(避免用错指针)

指针的类型转换

void*表示不知道指向什么东西的指针,计算时与char*相同(但不相通)

指针也可以转换类型:eg.  int *p = &i; void*q = (void*)p;

这并没有改变p所指的变量的类型,而是让后人用不同眼光通过p看它所指的变量

小结

指针的作用

需要传入较大的数据时用作参数

传入数组后对数组做操作

函数返回不止一个结果,需要用函数来修改不止一个变量

动态申请的内存

……


http://www.mrgr.cn/news/53340.html

相关文章:

  • IO编程--多线程实现文件拷贝
  • 爬虫逆向-js进阶(续写,搭建网站)
  • 刘诗诗亮相 VOGUE 时尚盛典,三套造型出尘绝伦,美丽再惊艳众人
  • 业务诊断简介
  • [强网杯 2019]随便注1
  • 实验21:红外遥控实验
  • 通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层
  • Hikyuu教程 | 滚动回测与滚动寻优系统
  • django5入门【02】创建新的django程序
  • win11 虚拟桌面切换后任务栏图标消失解决【中文互联网首发】
  • 强化学习与深度强化学习:深入解析与代码实现
  • 【MySQL】MySQL的简单了解详解SQL分类数据库的操纵方法
  • I\O进程线程(Day30)
  • 宽表和窄表
  • vb操作电子表格 增加工作表 工作表数据合并
  • 【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)
  • [Python基础](2) 基本数据类型
  • 车辆数据的提取、定位和融合(其三.一 共十二篇)子映射和时间加权
  • vb6 MSHFlexGrid1表格导出数据到电子表格 解决只能导出一次问题
  • VSCode C/C++跳转到定义、自动补全、悬停提示突然失效