我正在努力学习C.我一直在做的阅读解释了指针:
/* declare */
int *i;
/* assign */
i = &something;
/* or assign like this */
*i = 5;
我理解为i
= something
中存储的内容的地址
或者
将5或内部表示5放入* i指向的地址。
然而在实践中我看到了:
i = 5;
这不应该导致类型不匹配吗?
编辑:半冒号。 Ruby习惯..
答案 0 :(得分:3)
嗯,是的,在你的例子中设置一个指向5的int指针是类型不匹配,但这是C,所以没有什么能阻止你。这可能会导致故障。一些真正的hackery可能期望绝对地址为5的一些相关数据,但你永远不应该这样做。
英语等价物:
i = &something
指定i等于某事物的地址
*i =5
将我指向的内容分配给5。
答案 1 :(得分:2)
如果按照问题中的说法设置i = 5
,i
将包含地址0x00000005,这可能指向垃圾。
希望这有助于解释事情:
int *i; /* declare 'i' as a pointer to an integer */
int something; /* declare an integer, and set it to 42 */
something = 42;
i = &something; /* now this contains the address of 'something' */
*i = 5; /* change the value, of the int that 'i' points to, to 5 */
/* Oh, and 'something' now contains 5 rather than 42 */
答案 2 :(得分:2)
如果您看到了
的内容int *i;
...
i = 5;
然后有人试图将地址0x00000005
分配给i
。这个是允许的,虽然有点危险(N1256):
6.3.2.3指针
...
3一个整数常量表达式,其值为0,或者此类表达式强制转换为类型void *
,称为空指针常量。 55)如果将空指针常量转换为 指针类型,结果指针,称为空指针,保证比较不等于指向任何对象或函数的指针。
...
5整数可以转换为任何指针类型。除非事先指明,否则 结果是实现定义的,可能没有正确对齐,可能不指向 引用类型的实体,可能是陷阱表示。 56)
...
55)宏NULL
在<stddef.h>
(和其他标题)中定义为空指针常量;见7.17
56)用于将指针转换为整数或整数到指针的映射函数旨在与执行环境的寻址结构一致。
根据您正在使用的体系结构和环境,0x00000005
可能不是有效的整数地址(我熟悉的大多数体系结构都要求多字节类型以偶数地址开头)并且这样的低地址可能你的代码不能直接访问(我不做嵌入式工作,所以请耐心等待)。
答案 3 :(得分:1)
我理解为i =存储在某物中的东西的地址
实际上我包含一个地址,该地址应该是包含int的变量的地址。 我说应该因为你不能确定C:
char x;
int *i;
i = (int *)&x;
如果我是一个指针,而不是指定一个与你的程序可访问的有效地址不同的东西,那么我认为这个错误会导致未定义的行为:
int *i;
i = 5;
*i; //undefined behavior..probably segfault
这里有一些例子:
int var;
int *ptr_to_var;
var = 5;
ptr_to_var = var;
printf("var %d ptr_to_var %d\n", var, *ptr_to_var); //both print 5
printf("value of ptr_to_var %p must be equal to pointed variable var %p \n" , ptr_to_var, &var);
答案 4 :(得分:1)
我希望这会有所帮助。
这声明了一个变量名“myIntPointer”,其类型为“指向int的指针”。
int *myIntPointer;
这将获取名为“blammy”的int变量的地址,并将其存储在名为“myIntPointer”的int指针中。
int blammy;
int *myIntPointer;
myIntPointer = &blammy;
这需要一个整数值5并将其存储在内存空间中,该空间由名为“blammy”的int变量寻址,方法是通过名为“myIntPointer”的int指针赋值。
int blammy;
int *myIntPointer;
myIntPointer = &blammy;
*myIntPointer = 5;
这将名为“myIntPointer”的int指针设置为指向内存地址5。
int *myIntPointer;
myIntPointer = 5;
答案 5 :(得分:1)
分配硬编码地址是不应该做的事情(即使在嵌入式世界中,但是在某些情况下它是合适的。) 在声明指针时,限制自己仅使用动态分配的内存为其分配值(请参阅malloc())或使用&amp;静态(非临时)变量的(地址)。这将确保反叛代码,并减少获得着名分段错误的机会。
学习c的好运。