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

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.kler.cn/news/360381.html

相关文章:

  • Docker启动报错【flags: 0x5000: not a directory: unknown】
  • FPGA图像处理之三行缓存
  • 数据结构部分混淆
  • solid wrok笔记记录
  • Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色
  • Modbus TCP报错:Response length is only 0 bytes
  • github多个账号配置多个SSH秘钥
  • 在分类内用最大最小值筛选(每个分类找出一个)
  • 2011年国赛高教杯数学建模D题天然肠衣搭配问题解题全过程文档及程序
  • Python GUI 编程:tkinter 初学者入门指南——复选框
  • 归一化——5种方法详细分类说明
  • 重庆大学软件工程考研,难度如何?
  • Linux -- 进程间通信、初识匿名管道
  • Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)
  • OceanBase 的写盘与传统数据库有什么不同?
  • 一个检测work是否被包含在训练数据集中的工具
  • Spring-aop介绍
  • Adobe Acrobat DC 打印PDF文件,没有打印出注释的解决方法
  • 【Linux】文件IO深度解析:文件描述符与重定向的奥秘
  • LeetCode 1456.定长子串中元音的最大数目