C中的双指针和三指针 [英] Double and triple pointers in C

查看:139
本文介绍了C中的双指针和三指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个如下所示的小程序.该程序是为了更好地理解'C'中的指针在内存中的排列方式.

I have a small program as shown below.This program is an attempt to better understand pointers in 'C' how variables are arranged in memory.

#include <stdio.h>

const char *c = "hello";
const char **cp = &c;
const char ***cpp = &cp;
const char ****cppp = &cpp;

int main()
{

    printf("PTR (c)       : %p \n",c);
    printf("PTR (cp)      : %p \n",cp);
    printf("PTR (cpp)     : %p \n",cpp);
    printf("PTR (cppp)    : %p \n",cppp);
    printf("CONTENT (c)   : %c \n",*c);
    printf("CONTENT (cp)  : 0x%x \n",*(unsigned int*)cp);
    printf("CONTENT (cpp) : 0x%x \n",*(unsigned int*)cpp);
    printf("CONTENT (cppp): 0x%x \n",*(unsigned int*)cppp);
    return 0;
}

我在PC(Ubuntu 12.04)x86_64上获得的输出如下

The output that I get on my PC (Ubuntu 12.04) x86_64 is as follows

PTR (c)       : 0x4006dc 
PTR (cp)      : 0x601020 
PTR (cpp)     : 0x601028 
PTR (cppp)    : 0x601030 
CONTENT (c)   : h 
CONTENT (cp)  : 0x4006dc 
CONTENT (cpp) : 0x601020 
CONTENT (cppp): 0x601028 

  • cp包含c的地址
  • cpp包含cp的地址
  • cppp包含cpp的地址

现在,我对上述程序的二进制可执行文件执行一次nm.

Now I do an nm on the binary executable of the above program.

0000000000600e50 d _DYNAMIC
0000000000600fe8 d _GLOBAL_OFFSET_TABLE_
00000000004006d8 R _IO_stdin_used
                 w _Jv_RegisterClasses
0000000000600e30 d __CTOR_END__
0000000000600e28 d __CTOR_LIST__
0000000000600e40 D __DTOR_END__
0000000000600e38 d __DTOR_LIST__
0000000000400860 r __FRAME_END__
0000000000600e48 d __JCR_END__
0000000000600e48 d __JCR_LIST__
0000000000601040 A __bss_start
0000000000601010 D __data_start
0000000000400690 t __do_global_ctors_aux
0000000000400460 t __do_global_dtors_aux
0000000000601018 D __dso_handle
                 w __gmon_start__
0000000000600e24 d __init_array_end
0000000000600e24 d __init_array_start
0000000000400680 T __libc_csu_fini
00000000004005f0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
0000000000601040 A _edata
0000000000601050 A _end
00000000004006c8 T _fini
00000000004003c8 T _init
0000000000400410 T _start
0000000000601020 D c
000000000040043c t call_gmon_start
0000000000601040 b completed.6531
0000000000601028 D cp
0000000000601030 D cpp
0000000000601038 D cppp
0000000000601010 W data_start
0000000000601048 b dtor_idx.6533
00000000004004d0 t frame_dummy
00000000004004f4 T main
                 U printf@@GLIBC_2.2.5

下面,我对相关的内容进行了批驳.

Below I have repasted the relevant lines of intrest.

0000000000601020 D c
0000000000601028 D cp
0000000000601030 D cpp
0000000000601038 D cppp

据我所知,解释如下.

'c'是数据段的一部分(由'D'表示),位于地址0000000000601020 根据我的程序,这是'cp'的地址.所有变量都是这种情况.

'c' is a part of the data segment (denoted by 'D') and is at address 0000000000601020 According to my program that is the address of 'cp'.This is the case with all the variables.

我在这里缺少一些重要的东西吗?这是初学者试图很好地理解C指针的方法.

Am I missing something vital here.It is a beginners attempt to understand C pointers well.

推荐答案

'c'是数据段的一部分(用'D'表示),根据我的程序,它位于地址0000000000601020上.

'c' is a part of the data segment (denoted by 'D') and is at address 0000000000601020 According to my program that is the address of 'cp'.

实际上,当您打印时:

printf("PTR (cp)      : %p \n",cp);

它是cp,而不是cp地址. cp恰好是c地址,因为cp是指向c的指针.

It's the value of cp, not the address of cp. The value of cp is exactly the address of c, since cp is a pointer that points to c.

这篇关于C中的双指针和三指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆