尝试用指针做一些事情

时间:2014-03-08 11:11:21

标签: c pointers

您好我是新手指针,我正在尝试用它们制作程序,但它不起作用。

该程序 - 将获得一个数字,并且Pointer会将其增加为一个。

我的代码 -

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x = 0;
    int* px = NULL;

    printf("Enter a number: \n");
    scanf("%d",x);

    *px = x;
    px++;
    x = *px;

    printf("%d",x);

}

不幸的是,该计划不起作用如果你能帮助我,我会很高兴。

4 个答案:

答案 0 :(得分:3)

如果您详细说明“程序不起作用”将会有很大帮助 - 程序可以在很多方面“不起作用”。通过查看您的代码,我看到了以下几点:

  1. 使用错误的scanf:

    scanf("%d", x);
    

    scanf获取每个参数的变量指针,因此它知道写入的位置(哪个内存位置),因此正确的调用将是:

    scanf("%d", &x);
    
  2. 写入空指针和地址递增而不是值递增

    *px = x;
    

    您在main的开头初始化px指向NULL*px取消引用指针,以便您可以编写指针指向的实际内存。我想你在这里要做的是:

    • 将x的地址分配给px
    • 通过在px
    • 中使用x的间接引用来增加x
    • 通过取消引用px并将其再次分配给x来重新分配x给自己

    要获取变量的地址,您必须使用前缀&amp;运算符并将其直接分配给指针:

    px = &x;
    

    要增加指针指向的值,必须首先取消引用它,然后使用increment运算符对其进行操作:

    (*px)++;
    

    xx*px的自我分配是正确的,但是;)

答案 1 :(得分:0)

我猜你试图使用指向它的指针递增x,而不直接访问它。你这样编程会因为段错误而崩溃,因为你正在取消引用空指针。我建议进行以下更改 -

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x = 0;
    int *px = NULL;  // initialize to NULL

    printf("Enter a number: \n");

    // scanf takes a pointer to the variable where 
    // it writes the value read from stdin

    scanf("%d", &x); 

    px = &x;  //  make px point to x
    (*px)++;  // increment the object pointed to by px

    printf("%d", x);

}

请注意,没有括号的*px++会对指针本身进行后递增并取消引用它,因为++的优先级高于*。因此它与*(p++)相同。但是,您希望增加px指向的对象,而不是px本身。因此,您必须(*px)++

答案 2 :(得分:0)

这是你在做什么

scanf("%d",x); //read the number

*px = x; //assign the value of the pointer, the value of the number
px++;    //increment the pointer
x = *px; //assign x the value of the pointer

printf("%d",x);//display the number

所以你要指定x的值的指针值,而不是递增指针并将指针的值赋给X.但是现在指针指向不同的内存地址和该地址的值必须是堆栈上的东西...

以下是您应该做的事情:

scanf("%d",x); //read the number

px = &x; //assign the value of the pointer, the value value of x
(*px)++;   // the same as x++ since px holds the address of x

printf("%d",x);//display the number

这会使事情过于复杂,但这就是你使用指针

的方法

答案 3 :(得分:0)

以下是代码中应修复的内容,并附有详细说明:

px = &x; //您需要使用 & 运营商地址为您的指针分配内存地址。

请记住,在没有任何故意目的的情况下,不应在程序中使用未分配的指针。指针是可以存储某些其他数据结构或子例程入口点的内存地址(不完全是物理地址,但虚拟地址)的数据类型。

scanf("%d", &x); //您需要将变量的地址作为参数传递。

scanf函数扫描来自stdin 文件描述符的输入,在这种情况下,它接受从键盘设备输入的数据,其中stdin文件默认重定向到。该函数的原型在stdio.h头文件中声明如下:

int scanf(const char *format, ...);

因此,您需要将声明变量的指针或地址作为参数传递。

*px = x; //您可以使用* 取消引用运算符为指针引用的变量赋值。

但是,在您的代码中,此声明毫无意义。操作等于以下声明:

  x = x;

现在,我们来看看下面的陈述。他们都在做同样的事情......

  x = 10;   // Value is assigned directly.

*px = 10;   // Value is assigned via pointer by using dereference operator.

如果您希望对指针有更深入的了解,您可能会发现字符数组字符串操作更具说教性和趣味性。