Hello World我对C完全陌生,我正试图弄清指针的工作原理,所以我不知道为什么这个错误出现在我身上:
#include <stdio.h>
#include <stdlib.h>
void myPtr(int *nbr)
{
nbr = (void *)142;
printf("%d",nbr);
}
int main()
{
int *p;
myPtr(p);
}
答案 0 :(得分:0)
nbr的类型为int *,即它是指向内存中地址的指针,而取消引用该指针以获取其值将返回一个int。
我建议在myPtr函数中对您的代码进行以下修改:
首先,要设置nbr指向内存中包含整数142的位置,请使用:
nbr = (int *)malloc(sizeof(int));
*nbr = 142;
第一行为该指针分配内存,第二行取消对该指针的引用并将该地址的值设置为142。
第二,更改print语句以使用值而不是地址,如下所示:
printf("%d",*nbr);
由于nbr的类型为int *,而%d想要的是int而不是int指针,因此会出现打印nbr而不是* nbr的错误。
所有这些都假设您要打印出值142。如果要打印其他值,我的更改不会导致这种情况发生。
我希望我已经回答了您的问题,祝您C运气好!
答案 1 :(得分:0)
您的程序中发生了几件事。让我们从这一点开始:将指针视为计算机内存中的地址。在main()中,您说的是“ p是存储整数的位置的地址” ...在大多数实现中,这将是4个字节。但是p当前没有值。
在myPtr()例程中,将该地址设置为142:您告诉程序地址0x000008e(相当于142的十六进制)是4个字节的内存整数,但是您不知道该地址存储了什么。
printf()格式说明符“%d”表示您将传递一个整数...但是传递的是指向内存的指针,这就是为什么收到此警告的原因。如果您要打印的是地址,则可以使用“%p”格式,它告诉printf()实际上是在传递指针。
另一方面,如果要打印数字,则需要取消引用指针:
printf("%d", *nbr);
在大多数系统上遇到的问题是,您将遇到内存访问错误:大多数系统上的受保护内存页面(“页面0”)中都有地址0x0000008e(142),并且您可以通常不会读取或写入该内存。
我认为您需要找到一个很好的C指针在线教程,使用&获取变量的地址,并使用*访问指针。