• c语言之指针特性


    0x01.指针的声明

    char x;           char* x;
    short y;          short* y;
    int z;            int* z;
    float f;          float* f;
    double d;         double* d;
    Struct st;        Struct* st;
    

    从这边可以总结出来
    1、带有 * 的变量标准写法: 变量类型* 变量名
    2、任何类型都可以带* ,加上以后就是新的类型,统称 “指针类型”
    3、
    可以是任意多个

    0x02.指针变量赋值

    赋值有两种形式

    int x = 10;
    int* i;
    i = &x;
    printf("%#X", i);
    

    这边其实用到了取址符(&),也就是取出x变量的地址

    这边可以发现单单是变量i,没有加*的话,是存储x的地址
    i(0x4FF718) = x = 10
    这时候我们想得到i的值,我们就得再i那边加个*号

    发现成功打印出了值,这时候我们可以小总结一下了;
    1、&号是取址,取出指定变量的地址
    2、*号是取值,取出内存地址上面的值

    int* i;
    char* x;
    short* b;
    i = (int*)10;
    x = (char*)10;
    b = (short*)10;
    

    这种方式的赋值其实就是强转

    0x03.指针变量宽度


    总结:指针类型的变量永远是4字节,无论类型是什么,无论有几个*

    可以写一段代码看一下

    int main()
    {
    	char* i;
    	i = (char*)10;
    	return 0;
    }
    

    正常情况下char是1字节,byte;但是因为加了个*,变成了指针类型,所以是4字节,也就是dword类型

    从这边我们就可以验证了刚刚所想的

    0x04.指针类型自增自减

    char a = 100;
    short b = 100;
    innt c = 100;
    a++;
    b++;
    c++;
    

    总结:
    1、不带类型的变量,++或者--都是加1 或者减1
    2、带
    类型的变量,++或者--新增(减少)是去掉一个*后变量

    例子:
    比如short是4字节,但是要++的时候,++的宽度是去掉后的宽度
    short* a = 10;
    a++;
    a = 12
    因为short去掉*后是2字节,所以1 乘 2 等于2

    0x05.指针类型加减法

    char* a = 100;
    short* b = 100;
    int* c = 100;
    a = a+5;
    b = b+5;
    c = c+5;
    

    总结:
    1、指针类型的变量可以加、减一个整数,但不能乘除
    2、指针类型变量与其他整数相加或者相减时:
    指针类型变量 + N = 指针类型变量 + N 乘 (去掉一个*后类型的宽度)

    0x06.指针类型比较

    int main()
    {
    	char* i;
    	char* b;
    	i = (char*)10;
    	b = (char*)11;
    	if (b>i)
    	{
    		printf("b > i");
    	}
    	
    
    	return 0;
    }
    

    探测&变量的类型

    &是取地址符,任何变量都可以使用& 来获取地址,但是不能用在常量上。

    char a;
    short* b;
    int** c;
    
    int x =&a;
    int x = &b;
    int x = &c;
    


    可以得出编译器把 &a 当做char * 看待
    总结: 只要有&这个符号,那么编译器会把原本的类型加上个*看待

    我们再举个例子

    这时候short 原本就有一个了,但是因为值用了取址符(&),所以就在原本的类型再加个*

  • 相关阅读:
    Git fetch和git pull的区别
    gitlab数据迁移
    阿里云CentOS7挂载SSD云盘的方法
    phpQuery的用法
    用shell查找某目录下的最大文件
    gearman 简介
    学习笔记(3)——实验室集群WMS服务配置
    学习笔记(2)——实验室集群LVS配置
    Fedora16的双显卡切换问题
    学习笔记(1)——实验室集群配置
  • 原文地址:https://www.cnblogs.com/0x7e/p/13787079.html
Copyright © 2020-2023  润新知