指针(一)

  •   “带*类型” 的特征探测:宽度
  •   “带*类型” 的特征探测:声明
  •   “带*类型” 的特征探测:赋值
  •   “带*类型” 的特征探测:++ --
  •   “带*类型” 的特征探测:加上/减去 一个整数
  •   “带*类型” 的特征探测:求差值
  •   “带*类型” 的特征探测:比较

  对于一个变量来说,最重要的一个特征就是数据的宽度,如何探测某个类型的变量的宽度?

  答:我们可以用sizeof,当然最好我们是看反汇编看他到底分配几个字节。

1、“带*类型” 的如何声明?

  如何声明char/short/int类型的变量呢?

 char x;                

 short y;                

 int z;                

 float f;                

 double d;                

 struct Student
{
int level;
char name[];
}; Student st;

  声明带有*类型的变量

  

 

  总结: 

  1、带有*的变量类型的标准写法:变量类型* 变量名

  2、任何类型都可以带* 加上*以后是新的类型

  3、*可以是任意多个

2、“带*类型” 的特征探测:赋值

char、short、int 类型变量的赋值:

  

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char a;
short b;
int c; a = ;
b = ;
c = ; } int main(int argc, char* argv[])
{
function(); return ;
}

  反汇编代码如下:

  

  从 mov byte ptr ds:[ebp-4],1

  mov word ptr ds:[ebp-8],2。不难看出char占1个字节,short占2个字节,int占四个字节,但是从反汇编代码中可以看出,虽然char占1个字节,short占2个字节,但是编译器为它分配内存的时候,依旧是分配了4个字节

带*类型的变量的赋值:

  

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char* a;
short* b;
int* c; a = (char*);
b = (short*);
c = (int*); } int main(int argc, char* argv[])
{
function(); return ;
}

  

  从这段反汇编代码看出,这与普通变量的赋值毫无差别,说明仅仅从汇编角度,编译器是不识别你什么指针不指针的。

  我们再来看看带两颗*的情况

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char** a;
short** b;
int** c; a = (char**);
b = (short**);
c = (int**); } int main(int argc, char* argv[])
{
function(); return ;
}

  再观察带两个*的变量的反汇编

  可以看出与带一个*的反汇编代码一毛一样

  我们再来看看多颗*的情况,这回我下了一剂猛药,直接来十颗*!

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char********* a;
short********* b;
int********* c; a = (char*********);
b = (short*********);
c = (int*********); } int main(int argc, char* argv[])
{
function(); return ;
}

  观察反汇编代码如下!

  

  看到这,你可能会怀疑我是不是压根没看反汇编代码,而是直接把上面的复制过来了 ,如果不是复制过来的,那为毛他们反汇编代码一毛一样,一个符号都没有改呢?其实在反汇编里头,无论你是带有几颗*,一律只占(4)dword字节

再探数据的宽度:

  

  赋值+探测宽度我一并做过了,这个就不写了

  总结:

  1、带*类型的变量赋值时只能使用“完整写法”.

  2、带*类型的变量宽度永远是4字节、无论类型是什么,无论有几个*.

3、“带*类型” 的特征探测:++ --

  由于加法与减法是一样的,我这里只做加法的演示!!!

char、short、int类型:

  

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char a ;
short b ;
int c ; a = ;
b = ;
c = ; a++;
b++;
c++; printf("%d %d %d",a,b,c); } int main(int argc, char* argv[])
{
function(); return ;
}

  打印的结果如下:

·  

带*类型

  算了,为了合理演示,这里不适合从1颗*到多颗*,得反过来,得从多颗*到1颗*演示才好

  1、带多颗*的类型

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char********** a ;
short********** b ;
int********** c ; a = (char**********);
b = (short**********);
c = (int**********); a++;
b++;
c++; printf("%d\n %d\n %d\n",a,b,c);
} int main(int argc, char* argv[])
{
function(); return ;
}

  打印结果如下:

  

  2、带两颗*的类型

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char** a ;
short** b ;
int** c ; a = (char**);
b = (short**);
c = (int**); a++;
b++;
c++; printf("%d\n%d\n%d\n",a,b,c);
} int main(int argc, char* argv[])
{
function(); return ;
}

  打印结果如下:

  

  3、带一颗*的类型

  来了来了,重点在这!!!

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void function()
{
char* a ;
short* b ;
int* c ; a = (char*);
b = (short*);
c = (int*); a++;
b++;
c++; printf("%d\n%d\n%d\n",a,b,c);
} int main(int argc, char* argv[])
{
function(); return ;
}

  打印结果如下:

  

  注意看了,结果跟上面不一样了哦!

  做加法或者减法运算时,带*类型会在自身具体多少颗*的基础上,会砍掉一颗*做加法,减法

  还记得前面说的类型宽度吗?任何带*类型,它的宽度都是4字节,两颗*以上的,砍掉一颗*,他还是带*类型,只有是带一颗*的类型,他做加减的时候,砍掉一颗*就跟普通变量是一样的了

  总结:

  1、不带*类型的变量,++或者-- 都是假1 或者减1

  2、带*类型的变量,可是进行++ 或者 --的操作

  3、带*类型的变量,++ 或者 -- 新增(减少)的数量是去掉一个*后变量的宽度

4、“带*类型” 的特征探测:加上/减去 一个整数

  带一颗*的类型

 #include "stdafx.h"

 struct point
{
int a;
char arr[];
}; void functionAdd()
{
char* a ;
short* b ;
int* c ; a = (char*);
b = (short*);
c = (int*); a = a + ;
b = b + ;
c = c + ; printf("%d %d %d\n",a,b,c);
}
void functionSub()
{
char* a ;
short* b ;
int* c ; a = (char*);
b = (short*);
c = (int*); a = a - ;
b = b - ;
c = c - ;
printf("%d %d %d\n",a,b,c);
} int main(int argc, char* argv[])
{
functionAdd();
functionSub(); return ;
}

  打印结果如下:

   

  带两颗*的呢?

 #include "stdafx.h"

 void functionAdd()
{
char** a ;
short** b ;
int** c ; a = (char**);
b = (short**);
c = (int**); a = a + ;
b = b + ;
c = c + ; printf("%d %d %d\n",a,b,c);
}
void functionSub()
{
char** a ;
short** b ;
int** c ; a = (char**);
b = (short**);
c = (int**); a = a - ;
b = b - ;
c = c - ;
printf("%d %d %d\n",a,b,c);
} int main(int argc, char* argv[])
{
functionAdd();
functionSub(); return ;
}

  打印结果如下:

  

  带很多*的情况呢?

 #include "stdafx.h"

 void functionAdd()
{
char********** a ;
short********** b ;
int********** c ; a = (char**********);
b = (short**********);
c = (int**********); a = a + ;
b = b + ;
c = c + ; printf("%d %d %d\n",a,b,c);
}
void functionSub()
{
char********** a ;
short********** b ;
int********** c ; a = (char**********);
b = (short**********);
c = (int**********); a = a - ;
b = b - ;
c = c - ;
printf("%d %d %d\n",a,b,c);
} int main(int argc, char* argv[])
{
functionAdd();
functionSub(); return ;
}

  打印结果如下:

  

  总结:

  1、带*类型的变量可以加、减一个整数,但不能乘或者除.

  2、带*类型变量与其他整数相加或者相减时:

  带*类型变量 + N = 带*类型变量 + N*(去掉一个*后类型的宽度)

  带*类型变量 - N = 带*类型变量 - N*(去掉一个*后类型的宽度)

5、“带*类型” 的特征探测:求差值

  有点累了,就都写一块了,如果读者有心,建议后面的步骤,都如同上面的步骤一样,从char、short、int、__int64、结构体带*变量都试试,从一颗*到多颗*,都试试

  注意:只允许两个带星(*)类型做减法,不允许两个都带星(*)的类型相加,但是带星类型对整数类型可以做加减。

  希望各位看我博客的各位,不要记这些啊,这些都不用记得,你如果要说这么多内容不记住怎么懂呢?其实,你只需要按照我这个顺序,从char、short、int、__int64、数组,结构体定义变量,求宽度,做加减,作比较

  再到char、short、int、__int64、数组,结构体带一颗星的声明一个变量,求宽度、做加减,作比较

  再到char、short、int、__int64、数组,结构体带多颗星的声明一个变量,求宽度,做加减作比较,就自然懂了

  

 #include "stdafx.h"

 void CharOnePoint()
{
char* a ;
char* b ; a = (char*);
b = (char*); int x = a - b; printf("%d\n",x);
} void ShortOnePoint()
{
short* a ;
short* b ; a = (short*);
b = (short*); int x = a - b; printf("%d\n",x);
} void IntOnePoint()
{
int* a ;
int* b ; a = (int*);
b = (int*); int x = a - b; printf("%d\n",x);
} void CharMorePoint()
{
char********** a ;
char********** b ; a = (char**********);
b = (char**********); int x = a - b; printf("%d\n",x);
} void ShortMorePoint()
{
short********** a ;
short********** b ; a = (short**********);
b = (short**********); int x = a - b; printf("%d\n",x);
} void IntMorePoint()
{
int********** a ;
int********** b ; a = (int**********);
b = (int**********); int x = a - b; printf("%d\n",x);
} int main(int argc, char* argv[])
{
CharOnePoint();
ShortOnePoint();
IntOnePoint();
printf("\n\n\n");
CharMorePoint();
ShortMorePoint();
IntMorePoint(); return ;
}

   

  

  总结:

  1、两个类型相同的带*类型的变量可以进行减法操作.

  2、想减的结果要除以去掉一个*的数据的宽度.

6、“带*类型” 的特征探测:比较

 #include "stdafx.h"

 void function()
{
char**** a ;
char**** b ; a = (char****);
b = (char****); if(a>b)
{
printf("1\n");
}
else
{
printf("2\n");
} } int main(int argc, char* argv[])
{
function(); return ;
}

  

  总结:

  带*的变量,如果类型相同,可以做大小的比较。

C语言、指针(一)的更多相关文章

  1. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  2. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  3. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  4. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  5. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  6. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  7. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  8. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  9. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

  10. C语言指针声明探秘

    C语言指针声明探秘

随机推荐

  1. 常用类-Excel-使用Aspose.Cells插件

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...

  2. 详解Condition的await和signal等待/通知机制

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  3. JAVAEE学期总结

         声明:除第一张思维导图为博主所制作,其他思维导图皆来自网络,若侵权,望告知,必删除.                                                      ...

  4. 设计好的报表是如何在 web 上显示的

    润乾报表主要用来开发在 java web 端呈现的报表工具,设计器为桌面版,那么开发后的报表如何发布到 web 端是用户较为关心的问题. 润乾报表 web 端发布,采用 Taglib 方式,只需要在 ...

  5. 用两种以上的 方式实现一个方法或者对象,调用时打印"你好xx",已定义的代码不能做修改,自己编译的不能出现"你好"? (Javasctript)

    先上代码 const obj = { say(){ Array.from(arguments).forEach(item=>{ console.log(`${this.str} ${item}` ...

  6. Java中的“scanf()、cin()、input()"

    最近在写一个Java程序时遇到一个问题,就是如何在Java里面输入数值,又叫做获取键盘输入值. 因为c语言里面有scanf(),C++里面有cin(),python里面有input().Java里面有 ...

  7. ORA-04045: errors during recompilation/revalidation of LBACSYS.LBAC_EVENTS

    使用orachk工具检查数据库实例的时候,发现报告里面有类似下面这样一些错误(最近有给Oracle 10g应用补丁PSU 10.2.0.5.180717,不清楚是这个产生的还是其他原因导致),使用脚本 ...

  8. sso单点登录系统的压力测试

    环境:vmware centos7.4 2cpu 2核心 工具:ab压力测试工具 测试对象:sso单点登录系统 电脑:win10 4核 项目环境:flask+uwsgi+nginx(uwsgi 2进程 ...

  9. July 7th, 2019. Week 27th, Sunday

    We laughed and kept syaing "see you soon", but inside we both knew we would never see each ...

  10. SSH整合二

    结构图 articles模块 实体类Articles.java package com.jt.articles.entity; public class Articles { private Inte ...