指针(一)

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

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

  答:我们可以用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. Python中的常见特殊方法—— repr方法

    在Python中有些方法名.属性名的前后都添加了双下划线,这种方法.属性通常都属于Python的特殊方法和特殊属性,开发者可以通过重写这些方法或者直接调用这些方法来实现特殊的功能.其实前面见过的构造方 ...

  2. 怎么将CAD转PNG格式?这两种方法值得收藏

    在从事相关CAD工作的小伙伴们都知道,CAD中不光需要绘制各种各样的图纸,还需要根据工作的需要来进行图纸格式的转换工作.那有的时候就需要将CAD转换成PNG格式的图片进行使用.那怎么将CAD转PNG格 ...

  3. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之九:新建组织

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  4. SQL Server清理数据库日志的脚本-干货

    USE [master]GOALTER DATABASE AAAAAA SET RECOVERY SIMPLE WITH NO_WAITGOALTER DATABASE AAAAAA SET RECO ...

  5. nginx常见问题总结

    1.当有多个server{}时先匹配哪个?如果请求同时命中多个server,则先从上到下(如果是分布在多个配置文件中,则在文件夹中摆放在前面的文件优先被读取)先匹配到哪个算哪个. 2.location ...

  6. list集合优化,泛型的使用以及坼箱和装箱

    1.list vector线程同步,线程安全arraylist的运行速度较快,因为没有使用线程 LlinkedList以链表结构存储数据 2.泛型泛型类 泛型接口 泛型方法 泛型的属性泛型的属性 属性 ...

  7. go语言设计模式之Concurrency future

    future.go package future type SuccessFunc func(string) type FailFunc func(error) type ExecuteStringF ...

  8. 201871010111-刘佳华《面向对象程序设计(java)》第一周学习总结

    <面向对象程序设计(java)>第一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 ...

  9. (day67)作业

    有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/001.png', title: 'tv1'}, {img: 'img/tv/002.png ...

  10. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...