C/C++ 您当前所在位置:首页 > C/C++ > C语言指针探测(一)

C语言指针探测(一)

陈成 陈成 2020-07-13 22:06:00 C/C++ 198人已围观

简介 指针在C中是一个至高点,如果指针没学好,那么C就相当于白学。我这里将学习笔记记录下来,一步一步了解指针到底是个什么东西,如何使用。

记录指针之前呢先说明一下,有人之前了解过指针,理解的指针就是地址,我想说我们先忘了它,忘了指针就是地址的事。下面记录开始。

声明

我们了解过char,short,int或者结构体等这些类型,我们现在要学习一个新的类型,这个新类型就可以在原来学的任何类型后面加一个“*”,我们以int类型来举例。

int main(int argc, char* argv[])
{
    int c;
}

上面一行代码我们都知道,定义一个变量,我们可以在int后面加一个“*”号,变成int* c;,这个星号可以放在类型后面,也可以放在变量名前面,如

int main(int argc, char* argv[])
{
    //可以这样
    int* c;
    //或者这样
    int *c;
}

这两种写法都一样,建议放在类型后面。

这个“*”是没有数量限制的,可以写一个、两个、三个。。。

int main(int argc, char* argv[])
{
    int* a;
    int** b;
    int*** c;
    int*********** x;
}

如何赋值

int main(int argc, char* argv[])
{
    char* a;
    short* b;
    int* c;
    //赋值
    a = (char*)10;
    b = (short*)20;
    c = (int*)30;
}

这是完整的赋值方法,像平常我们给int赋值的时候,完整的赋值应该是x = (int)10;由于现在编译器比较智能,所以这个赋值可以简写,但带有“*”号类型的赋值是不能简写的,必须要用完整的写法。上面演示的是一个“*”的类型,如果定义的时候是两个“*”或者多个“*”,赋值的时候前面小括号里面的类型也要跟着变。

宽度探测

我们知道char、short、int这些类型在局部变量中编译器分配了四字节,有些类型并没有四字节,使用的时候也没有使用四字节,但确分配了四字节。那我们来看看带“*”的类型是如何分配的。

int main(int argc, char* argv[])
{
	char* a = (char*)1;
	short* b = (short*)2;
	int* c = (int*)3;
	return 0;
}

看一下反汇编

00401078   mov         dword ptr [ebp-4],1

0040107F   mov         dword ptr [ebp-8],2

00401086   mov         dword ptr [ebp-0Ch],3

上面是加一个“*”,再试试加两个“*”

int main(int argc, char* argv[])
{
    char** a = (char**)1;
    short** b = (short**)2;
    int** c = (int**)3;
    return 0;
}

再看看反汇编

00401078   mov         dword ptr [ebp-4],1

0040107F   mov         dword ptr [ebp-8],2

00401086   mov         dword ptr [ebp-0Ch],3

通过上面我们看出,不管原来什么类型,加了“*”以后,不管几个“*”,这个新类型宽度都是四字节。

++或--

int main(int argc, char* argv[])
{
    char* a = (char*)1;
    short* b = (short*)1;
    int* c = (int*)1;
    a++;
    b++;
    c++;
    printf("%d %d %d",a,b,c);
    return 0;
}

运行上面程序打印出来的结果分别是2、3、5。再看。

int main(int argc, char* argv[])
{
    char** a = (char**)1;
    short** b = (short**)1;
    int** c = (int**)1;
    a++;
    b++;
    c++;
    printf("%d %d %d",a,b,c);
    return 0;
}

这里三个结果都是5。因为带“*”类型加加减减计算公式为去掉一个“*”,计算剩余的类型的宽度是多少,是多少就加加或减减多少。第一个示例中类型带一个“*”,去掉一个“*”,所以剩下的类型宽度分别是1、2、4字节,加加后结果就是2、3、5。而第二个示例中是两个“*”的类型,去掉一个也还有一个,前面说过只要是带“*”的类型宽度都是4,所以第二个示例结果都是5。

减减和加加一样,就不记录了。

暂时先记录到这里吧。

文章评论

发送

站点信息

  • 上线时间:2020年05月30日
  • 网站程序:自建框架
  • 博客模板:今夕何夕
  • 文章统计43篇文章
  • 评论统计0条评论
  • 留言统计0条留言
  • 统计数据:百度统计