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

C语言指针探测(三)

陈成 陈成 2020-07-15 20:53:36 C/C++ 161人已围观

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

地址符(&)

任何变量都可以在前面加上一个&来获取该变量的地址,但常量不可以。如:

int main(int argc, char* argv[])
{
    char a = 10;
    char* pa = &a;
    return 0;
}

定义一个a变量,然后再取出地址放到pa变量中,注意通过“&”符号返回的结果类型为当前变量类型再加一个“*”。所以char类型获取地址后类型就是char*,int类型获取地址后类型是int*,包括本身就带有“*”的类型,如:int*类型的变量,获取地址后类型就是int**。

求带“*”类型的值

int main(int argc, char* argv[])
{
    int* a = 10;
    int** b = 20;
    //取值
    int x = *a;
    int* y = *b;
    return 0;
}

上面取变量a和b的值,通过在变量前面加一个“*”,其结果的类型就是该变量本身的类型去掉一个“*”。所以后面变量x和y的类型都分别少了一个“*”,这个和地址符(&)是相反的。结合C语言指针探测(一)C语言指针探测(二)中来看,很容易绕晕,啥玩意儿啊,一会儿去“*”,一会儿加“*”。其实也没那么难,用心理解理解就好了。

还有一点要说明,如果一个变量类型本身不带“*”,是不能在变量前面加“*”来取值的。

那*a这种语法到底是干嘛呢?

int main(int argc, char* argv[])
{
    int a = 10;
    int* pa = &a;
    //注意下面
    int a1 = *pa;
    return 0;
}

执行代码看看反汇编。

00401028   mov         dword ptr [ebp-4],0Ah

0040102F   lea         eax,[ebp-4]

00401032   mov         dword ptr [ebp-8],eax

00401035   mov         ecx,dword ptr [ebp-8]

00401038   mov         edx,dword ptr [ecx]

0040103A   mov         dword ptr [ebp-0Ch],edx

前三行好理解,将10放在第一个局部变量,再将第一个局部变量的地址放在第二个局部变量。从第四行开始,首先将第二个局部变量的值放在ecx,这个时候ecx的值其实就是变量a的地址。然后第5行将这个值当成地址再去将这个地址的值放在edx,最后放到第三个局部变量中。一句话就是不直接将变量的值取出,而是将变量的值当成地址再去取一次值。

最后我们用“*”来循环打印一个数组练习一下。

int main(int argc, char* argv[])
{
    int arr[6] = {1,2,3,4,5,6};
    //将数组第一个变量地址取出,也就是数组首地址
    //int* px = &arr[0];
    //上面的写法还有一个简写形式,一样,将数组首地址放到px变量中
    int* px = arr;
    for(int i = 0; i < 6; i++)
    {
        printf("%x\n", *(px+i));
    }
    return 0;
}

通过带“*”类型的变量(px)加上一个数(i)用“*”来取值 ,这里就用到了前面记录的带“*”类型加上一个整数。 

文章评论

发送

站点信息

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