printf 地址_C语言查找内存地址的&运算符

db938cc7669c4d1a9bd087d51043bd29.png

指针(pointer)是C语言最重要的(有时也是最复杂的)概念之一,用于存储变量的地址。前面使用的scanf()函数中就使用地址作为参数。概括地说,如果主调函数不使用return返回的值,则必须通过地址才能修改主调函数中的值。接下来,我们将介绍带地址参数的函数。首先介绍一元&运算符的用法。

一元&运算符给出变量的存储地址。如果pooh是变量名,那么&pooh是变量的地址。可以把地址看作是变量在内存中的位置。假设有下面的语句:

pooh = 24;

假设pooh的存储地址是0B76(PC地址通常用十六进制形式表示)。那么,下面的语句:

printf("%d %pn", pooh, &pooh);

将输出如下内容(%p是输出地址的转换说明):

24 0B76

下列程序使用了这个运算符查看不同函数中的同名变量分别存储在什么位置。

/* loccheck.c  -- checks to see where variables are stored  */#include void mikado(int);                      /* declare function  */int main(void){    int pooh = 2, bah = 5;             /* local to main()   */    printf("In main(), pooh = %d and &pooh = %p",            pooh, &pooh);    printf("In main(), bah = %d and &bah = %p",            bah, &bah);    mikado(pooh);    return 0;}void mikado(int bah)                   /* define function   */{    int pooh = 10;                     /* local to mikado() */    printf("In mikado(), pooh = %d and &pooh = %p",            pooh, &pooh);    printf("In mikado(), bah = %d and &bah = %p",            bah, &bah);}

程序清单9.12中使用ANSI C的%p格式打印地址。我们的系统输出如下:

In main(), pooh = 2 and &pooh = 0x7fff5fbff8e8In main(), bah = 5 and &bah = 0x7fff5fbff8e4In mikado(), pooh = 10 and &pooh = 0x7fff5fbff8b8In mikado(), bah = 2 and &bah = 0x7fff5fbff8bc

实现不同,%p表示地址的方式也不同。然而,许多实现都如本例所示,以十六进制显示地址。顺带一提,每个十六进制数对应4位,该例显示12个十六进制数,对应48位地址。

该例的输出说明了什么?首先,两个pooh的地址不同,两个bah的地址也不同。因此,和前面介绍的一样,计算机把它们看成4个独立的变量。其次,函数调用mikado(pooh)把实际参数(main()中的pooh)的值(2)传递给形式参数(mikado()中的bah)。注意,这种传递只传递了值。涉及的两个变量(main()中的pooh和mikado()中的bah)并未改变。

我们强调第2点,是因为这并不是在所有语言中都成立。例如,在某些语言中,子例程会影响主调例程的原始变量。子例程的变量名可能与原始变量不同,但是它们的地址相同。但是,在C语言中不是这样。每个C函数都有自己的变量。这样做更可取,因为这样做可以防止原始变量被被调函数中的副作用意外修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: memset 函数可以用来将一块内存空间的值设置为指定的值,它常用于对数组、结构体等数据结构进行初始化操作。不过需要注意的是,对于结构体内部的指针变量,使用 memset 并不能直接将其初始化为 NULL,因为在内存中 NULL 的值并不是 0。 一个比较好的做法是,在结构体定义的时候将指针变量初始化为 NULL,例如: ``` struct Node { int data; struct Node *next; }; struct Node node = {0, NULL}; ``` 这样就可以确保在使用 memset 进行清零操作时,结构体内部的指针变量也被正确地初始化为 NULL。 如果要使用 memset 对结构体进行清零操作,可以使用以下代码: ``` struct Node node; memset(&node, 0, sizeof(struct Node)); ``` 这里我们使用 & 符号获取结构体变量的地址,然后将其作为 memset 函数的第一个参数传入。第二个参数是要设置的值,这里我们设置为 0 表示清零。第三个参数则是结构体的大小,可以使用 sizeof 运算符来获取。 需要注意的是,使用 memset 函数进行清零操作时,要确保结构体中的所有成员变量都可以被正确地清零,否则可能会导致程序出现未知的错误。另外,在使用 memset 函数时,也需要注意不要越界访问内存空间。 ### 回答2: memset函数是C语言中用于对指定的内存块进行初始化的函数,常见的使用方式是对数组和字符串进行初始化。然而,对于结构体内部包含指针的情况,memset函数并不能直接用于初始化指针所指向的内存空间。 原因在于,memset函数是以字节为单位进行操作的,而指针的大小往往是4个字节或8个字节,因此无法准确地将指针的值初始化为NULL或其他指定的值。 对于结构体内部的指针,我们可以通过手动逐个成员初始化的方式,来达到初始化的目的。例如,可以先将结构体的指针成员赋值为NULL,然后再逐个成员进行初始化。示例如下: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int *ptr; int num; } MyStruct; void initializeStruct(MyStruct *s) { s->ptr = NULL; s->num = 0; } int main() { MyStruct s; initializeStruct(&s); printf("ptr = %p\n", s.ptr); printf("num = %d\n", s.num); return 0; } ``` 在上述代码中,通过initializeStruct函数对结构体s进行初始化,将s.ptr赋值为NULL,将s.num赋值为0。这样就可以实现对结构体内部指针的初始化。 需要注意的是,对于结构体内部嵌套的其他结构体或者动态分配的内存空间,我们同样需要手动进行逐个成员初始化,以确保结构体内部的所有指针都被正确初始化,并且不产生内存泄漏的问题。 ### 回答3: memset是C语言中的一个函数,用于对一段内存空间进行初始化操作。它可以将指定内存区域的每个字节都设置为特定的值。 在C语言中,结构体是一种用户定义的数据类型,它可以包含多个不同类型的变量。结构体可以被看作是一种形式上的数据集合,可以统一管理一组相关的变量。 结构体内可以包含指针变量,这些指针变量可以指向堆内存中的某个地址。然而,当我们使用memset来初始化结构体内的指针时,需要注意指针变量指向的内存空间是否已经被分配。 由于memset函数只能设置内存空间的值,并不能为指针变量分配内存,因此在使用memset初始化结构体内指针之前,需要先为指针变量分配足够的内存空间。否则,如果指针未指向有效的内存地址,当我们尝试访问这个指针时,可能会导致程序崩溃或者产生未知的结果。 所以在使用memset来初始化结构体内指针时,我们需要先为这些指针变量分配内存,并在memset函数调用之后再对这些指针进行进一步的操作,以确保指针变量的正确性和有效性。 在使用结构体时,我们也可以将多个结构体通过指针链接成链表结构,形成一种更加复杂的数据结构。链表可以通过指针将各个结构体连接起来,方便进行数据的插入、删除和查找等操作。 此外,C语言还提供了枚举类型,它可以定义一些常量集合,方便程序员使用和维护。枚举类型可以用于表示一组相关的取值,通过定义的枚举常量,我们可以直观地理解程序中的某些状态或者选项。 总之,结构体、链表和枚举是C语言中重要的概念和特性,它们能够帮助我们更好地组织和管理程序中的数据,提高代码的可读性和可维护性。在使用这些特性时,我们需要注意指针的正确使用和内存的分配释放,以避免出现错误和内存泄漏等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值