美文网首页从汇编到C++
C语言14 指针类型

C语言14 指针类型

作者: Asura_Luo | 来源:发表于2018-05-04 02:48 被阅读0次

C语言14 指针类型

指针是C语言中的一种数据类型,

定义带 "*"类型的变量

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

总结:

  1. 任何带有*的变量类型的标准写法:变量类型* 变量名
  2. 任何类型都可以带* 加上* 以后是新的类型,统称为“指针类型”
  3. *可以使任意多个。

指针变量赋值

char* x;        char*** x;          char******* x;
short* ~~
int* ~~
Student* ~~
x = (char*)1;
y = (short*)2;
~~~

int******* x;
int******* y;
x = (int*******)4;
y = x;

char x;
x = 1;

指针变量的宽度

char x;     char* x;        char******** x;
short y;    short* y;       short******** y;
~~

x=1;    x=(char*)1;         x=(char********)1;
~~    
9:        char* x;
10:       short* y;
11:       int* z;
12:
13:       x = (char*)1;
00401028 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1
14:       y=(short*)2;
0040102F C7 45 F8 02 00 00 00 mov         dword ptr [ebp-8],2
15:       z=(int*)3;
00401036 C7 45 F4 03 00 00 00 mov         dword ptr [ebp-0Ch],3


9:        char******** x;
10:       short******** y;
11:       int******** z;
12:
13:       x = (char********)1;
00401028 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1
14:       y=(short********)2;
0040102F C7 45 F8 02 00 00 00 mov         dword ptr [ebp-8],2
15:       z=(int********)3;
00401036 C7 45 F4 03 00 00 00 mov         dword ptr [ebp-0Ch],3

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

指针类型自加和自减(++ / --)

char a;                     char**** a;
short b;                    short**** b;
int c;                      int**** c;
a=100;                      a=(char****)100;
b=100;                      b=(short****)100;
c=100;                      c=(int****)100;
a++;                        a++;
b++;                        b++;
c++;                        c++;

printf("%d %d %d",a,b,c);   printf("%d %d %d",a,b,c);

11:       char* a;
12:       short* b;
13:       int* c;
14:       a=(char*)100;
0040B488 C7 45 FC 64 00 00 00 mov         dword ptr [ebp-4],64h
15:       b=(short*)100;
0040B48F C7 45 F8 64 00 00 00 mov         dword ptr [ebp-8],64h
16:       c=(int*)100;
0040B496 C7 45 F4 64 00 00 00 mov         dword ptr [ebp-0Ch],64h
17:       a++;
0040B49D 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040B4A0 83 C0 01             add         eax,1
0040B4A3 89 45 FC             mov         dword ptr [ebp-4],eax
18:       b++;
0040B4A6 8B 4D F8             mov         ecx,dword ptr [ebp-8]
0040B4A9 83 C1 02             add         ecx,2
0040B4AC 89 4D F8             mov         dword ptr [ebp-8],ecx
19:       c++;
0040B4AF 8B 55 F4             mov         edx,dword ptr [ebp-0Ch]
0040B4B2 83 C2 04             add         edx,4
0040B4B5 89 55 F4             mov         dword ptr [ebp-0Ch],edx

比如 
int* c =1; c++; 去掉* 是int   4个字节 就+4;
char* c=1; c++; 去掉* 是char  1个字节 就+1
char** c=1; c++; 去掉* 是char* 指针类型是4个字节 就+4 

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

总结、

  1. 不带*变量的变量,++或者--都是加1 或者减1
  2. *类型的变量m,++或者-- 新增(减少)的数量是去掉一个*后变量的宽度
image

指针类型的比较

char**** a;
char**** b;
a = (char****)200;
b = (char****)100;
if(a>b)
{
    printf("1");
}
else
{
    printf("2");
}

12:       char**** a;
13:       char**** b;
14:       a = (char****)200;
0040B488 C7 45 FC C8 00 00 00 mov         dword ptr [ebp-4],0C8h
15:       b = (char****)100;
0040B48F C7 45 F8 64 00 00 00 mov         dword ptr [ebp-8],64h
16:       if(a>b)
0040B496 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040B499 3B 45 F8             cmp         eax,dword ptr [ebp-8]
0040B49C 76 0F                jbe         main+3Dh (0040b4ad)
17:       {
18:           printf("1");
0040B49E 68 1C F0 41 00       push        offset string "1" (0041f01c)
0040B4A3 E8 A8 02 00 00       call        printf (0040b750)
0040B4A8 83 C4 04             add         esp,4
19:       }
20:       else
0040B4AB EB 0D                jmp         main+4Ah (0040b4ba)
21:       {
22:           printf("2");
0040B4AD 68 50 FE 41 00       push        offset string "2" (0041fe50)
0040B4B2 E8 99 02 00 00       call        printf (0040b750)
0040B4B7 83 C4 04             add         esp,4

//这里编译器使用了jbe指令 jbe指令是用来比较无符号数的,也就说明指针类型是无符号数

总结
指针类型可以做大小比较

image

相关文章

  • C语言14 指针类型

    C语言14 指针类型 指针是C语言中的一种数据类型, 定义带 "*"类型的变量 总结: 任何带有*的变量类型的标...

  • go语言指针类型的使用

    go语言的指针类型 简单地说go语言的指针类型和C/C++的指针类型用法是一样的,除了出去安全性的考虑,go语言增...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • iOS开发 -- C语言基础8(指针)

    iOS开发 -- C语言基础8(指针) 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很...

  • C语言-指针类型

    改值场景示例 指针就一个作用:能够根据一个地址值,访问对应的存储空间 定义指针变量 [作用:取值 和 赋值]指针变...

  • 2018-06-05

    C语言指针教程 (一)什么是C语言指针指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。...

  • 面试常问C++基础

    有关语言基础: c/c++程序的编译过程(GCC的编译流程) 强类型语言 VS 弱类型语言 数组和指针的区别 字符...

  • c++11智能指针父类指针转换为子类指针

    1 C语言指针类型转换 C语言中的指针就是裸指针,裸指针存储是指向计算机内存的某一(起始)地址,通过*取值操作符可...

  • 在Swift中使用C语言的指针

    Objective-C和C语言经常需要使用到指针。Swift中的数据类型由于良好的设计,使其可以和基于指针的C语言...

  • Go语言指针

    只讲述和C语言地址的不同 格式:var 指针名称 *数据类型var 指针名称 *数据类型 = 地址 指向数组的指针...

网友评论

    本文标题:C语言14 指针类型

    本文链接:https://www.haomeiwen.com/subject/noyrrftx.html