我正在尝试学习C语言。我所阅读的资料将指针解释如下:
/* declare */
int *i;
/* assign */
i = &something;
/* or assign like this */
*i = 5;
我理解这意味着i
= 存储在something
中的内容的地址。
或者
将5或5的内部表示放入*i指向的地址中。
然而,在实践中,我看到:
i = 5;
这不会导致类型不匹配吗? 编辑:分号。Ruby 语法习惯...
好的,是的,在您的示例中将int指针设置为5是类型不匹配,但这是C语言,所以没有任何限制。这可能会导致故障。一些真正的黑客行为可能会期望在绝对地址5处有一些相关数据,但您永远不应该这样做。
英文等效内容:
i = &something
将i赋值为某个东西的地址
*i =5
将i所指向的内容赋值为5。
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 */
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
可能不是有效的整数地址(我熟悉的大多数架构都要求多字节类型以偶地址开始),这样低的地址可能无法被您的代码直接访问(我不从事嵌入式工作,因此请谨慎考虑)。
char x;
int *i;
i = (int *)&x;
如果i是一个指针,那么将其分配给一个不同于程序可访问的有效地址,这是一个错误,我认为可能会导致未定义的行为:
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);
i = 5;
将 5
的地址放入 i
中?这与执行 i = &5
有什么不同吗? - providence希望这可以帮到你。
这声明了一个名为“myIntPointer”的变量,其类型为“指向整数的指针”。
int *myIntPointer;
int blammy;
int *myIntPointer;
myIntPointer = &blammy
这段代码将整数值5存储在内存中由int变量"blammy"寻址的空间中,通过一个名为"myIntPointer"的int指针分配该值。
int blammy;
int *myIntPointer;
myIntPointer = &blammy
*myIntPointer = 5;
这将把名为“myIntPointer”的整型指针设置为指向内存地址5。
int *myIntPointer;
myIntPointer = 5;
将硬编码地址分配作为一种做法不应该被采用(即使在嵌入式领域中,但有些情况下是适合的)。 在声明指针时,请限制自己仅使用动态分配的内存(请参见malloc())或静态(非临时)变量的&(地址)来为其分配值。这将确保强健的代码,并减少获得臭名昭着的分段错误的机会。
祝您学习c顺利。
i
的类型为int*
时,你应该看到的只有编译器错误,而你可能看到的是具有自动存储期的变量,如int i
。 - pmrres
都被声明为*con
和*res
,但以我上面质疑的方式进行分配。 - providence