1
#include <stdio.h>

int j;
int *ptr;

int main(void)
{
    j = 13232323;//adress I want to assign
    ptr = j;//assign the adress to the pointer
    printf("%d",ptr);
}

输出:13232323

将地址直接分配给指针我做错了吗?指针只不过是一个变量,包含地址形式的值,所以我构造了一个地址,然后将它分配给指针,它按预期工作,只是我不能构造一个包含字符 ABCDEF 的地址,所以,什么是int 和指针的最大区别是什么?

编辑:此代码仅用于测试目的

4

7 回答 7

6

其实你的尝试是出于你的渴望。我同意,我经常这样做。

第一件事是如果你存储13232323在一个指针变量中,它的十六进制值是OXC9E8C3.,所以在你分配指针变量(ptr)的时候真的不知道它是一个有效的地址还是无效的地址。但是当你用 取消引用这个地址时*ptr,问题就来了。它试图寻找地址中的值。然后有2种情况..

  1. 真的,如果您分配的是有效地址,那么它将返回该值。(几乎不可能的情况)
  2. 大多数情况下,您的地址将是无效的,因此程序将崩溃(分段错误)。

因此,即使您的程序编译、运行,除非您将有效地址存储在ptr. 中,否则ptr也没有任何用处。

你的问题:它按预期工作,除了我不能构造一个包含字符 ABCDEF 的地址,那么,int 和指针之间的最大区别是什么?printf("%d",ptr);

我想您是在问,无论如何,我无法存储 ABCDEF,因此ptr与 相同int type,那么整数和指针之间有什么区别?

这里是 :

  1. 你不能尊重一个整数值,而指针可以做到这一点。因此它被称为指针:)
  2. 您只看到数字,因为您正在使用 打印地址%d,尝试使用%x或打印%p

Atlast,您是否注意到编译器警告,warning: assignment makes pointer from integer without a cast, 因为ptr = j;ptrint*类型,并且jint 类型。

于 2013-07-14T06:35:28.017 回答
4

您需要使用%x,或者您可以发送*ptrprintf

printf("%d", *ptr);// if you are using this you need to know what are you pointing at, and that it will be an integer

或者

printf("%x", ptr);

%p正如下面的评论所说,使用而不是%x因为%x调用未定义的行为者总是更好。在使用时也%p应该将他的指针指向(void *)

于 2013-07-14T06:12:53.890 回答
2

您的代码无效。C 语言不允许这种赋值

ptr = j;

如果没有显式强制转换,整数值不能转换为指针类型(常量零是唯一的例外)。

如果代码被您的编译器接受,则仅意味着您的编译器将语言扩展到其正式范围之外。许多编译器以一种或另一种方式做到这一点。但是,如果您的编译器在没有发出诊断消息(警告或错误)的情况下接受了此代码,那么您的编译器已严重损坏。

换句话说,我们程序的行为与 C 语言几乎没有关系(或根本没有关系)。

于 2013-07-14T07:51:51.203 回答
2

在 C 中,您可以进行大部分类型转换,甚至类型完全不相关。虽然它可能会引起警告。确保您的类型转换有意义。

于 2013-07-14T07:58:33.460 回答
1

从语法上讲,您在这里没有做错任何事情。无论如何,您可以将一个指针分配给另一个指针,并且由于它们仅包含您在此处分配的地址,因此这就是指针分配期间实际发生的情况。
但是您永远不应该分配一个随机地址并尝试取消引用它,因为除非由机器分配,否则您的程序无法访问内存位置。您应该使用 malloc() 之类的函数从机器请求内存。
至于指针和整数之间的区别,最大的一个是您can't use a dereference operator (*) on an integer访问它包含的地址处的值。
您可以can construct addresses using ABCDEF通过在地址值前面加上0X0x表示十六进制表示法。

于 2013-07-14T06:36:39.727 回答
1
  • 将地址直接分配给指针我做错了吗?

是的,唯一应该像你一样直接使用指针的整数类型是intptr_tand uintptr_t,如果它们存在的话。如果它们不存在,您根本不应该这样做。即使这样,您也必须使用显式强制转换来进行转换。

  • 指针不过是一个变量,包含地址形式的值,所以我构造了一个地址,然后将它分配给指针,它按预期工作,只是我不能构造一个包含字符 ABCDEF 的地址,所以,什么是int 和指针的最大区别是什么?

不,在某些架构上,指针可能比这更复杂。存储器可以例如被分段,因此将存在对段进行编码的指针值的一部分和对该段中的偏移进行编码的另一部分。现在这样的架构很少见,然而这仍然是 C 标准允许的。

于 2013-07-14T07:28:49.120 回答
0

您需要 ptr 通过执行以下操作来保存 j 的地址

ptr = &j;

ptr 持有,等于,j的地址

并且您想通过以下内容打印 ptr 指向的内容

printf("%d",*ptr);

并获取 ptr 的地址,请执行以下操作

printf("%x",ptr);

x 表示十六进制

于 2013-07-14T06:19:26.183 回答