C指针 - 非常基本

时间:2015-03-03 15:22:41

标签: c pointers

为什么我无法访问像这样的指针的值:

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

int main(void)
{
    int *num = 5;

    printf("\n%d\n", *num);

    getchar();
    return 0;
}

提前感谢。

3 个答案:

答案 0 :(得分:4)

因为您要为指针指定任意地址,并且您无法保证它是有效的,或者您的程序是否可写或可读。

指针需要指向有效内存以便取消引用它,使指针指向有效内存,你可以在函数中声明一个变量并指向它在堆栈中的地址,如下所示

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

int main(void)
{
    int  number  = 5;
    int *pointer = &number;

    printf("%d\n", *pointer);
    return 0;
}

此处,pointer指针指向使用运算符number地址的&地址。

此外,*符号在上面的代码中有不同的用法,在第一种情况下它用于指针声明,在第二种情况下它用于指针解引用,所以这也是有效的

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

int main(void)
{
    int  number;
    int *pointer = &number; /* declare a pointer and point with it to `number's` address */
    /* assign a value to the pointer via dereferencing the pointer */
    *pointer = 5;
    /* check this, the value of `number` has changed */
    printf("%d\n", number);
    return 0;
}

答案 1 :(得分:0)

指针不可解除引用,甚至无效。通常,指针仅在对象的地址,数组的一个接一个末尾或null时才有效。如果指针有效且非空,也不是一个结尾,则指针是可解除引用的。

尝试取消引用不可解除引用的指针会导致未定义的行为。

答案 2 :(得分:0)

实际上你正在访问你提到的指针。但问题是您不知道位置5的位置或者是否是有效地址。
m5的初始化无效,将调用未定义的行为。