用C语言打印字符指针

用C语言打印字符指针,c,pointers,C,Pointers,编写以下代码时,我正在学习C语言中的指针: #include <stdio.h> main() { char *p = 0; *p = 'a'; printf("value in pointer p is %c\n", *p); } 有人能解释为什么第一个程序失败,而第二个程序成功运行吗?您的代码调用未定义的行为,因为您正在取消引用NULL1指针。指针需要指向有效内存,一个简单的方法就是 #include <stdio.h> int // `m

编写以下代码时,我正在学习C语言中的指针:

#include <stdio.h>
main()
{
    char *p = 0;
    *p = 'a';
    printf("value in pointer p is %c\n", *p);
}

有人能解释为什么第一个程序失败,而第二个程序成功运行吗?

您的代码调用未定义的行为,因为您正在取消引用
NULL
1指针。指针需要指向有效内存,一个简单的方法就是

#include <stdio.h>

int // `main()' MUST return `int'
main(void)
{
    char *pointer;
    char value;

    pointer = &value; // Now the pointer points to valid memory
    *pointer = 'a';

    printf("value in pointer p is %c\n", *pointer);
    return 0;
}
#包括
int/`main()'必须返回`int'
主(空)
{
字符*指针;
字符值;
pointer=&value;//现在指针指向有效内存
*指针='a';
printf(“指针p中的值为%c\n”,*指针);
返回0;
}

一, 6.3.2.3指针

  • 值为0的整型常量表达式或转换为类型
    void*
    的此类表达式称为空指针常量。66)如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行不相等的比较

  • 66)宏
    NULL
    在(和其他标题)中定义为空指针常量;见7.19

    6.5.3.2地址和间接运算符

    语义

  • 一元
    *
    运算符表示间接寻址。如果操作数指向函数,则结果为函数指示符;如果它指向一个对象,结果是一个指定该对象的左值。如果操作数的类型为“指向类型的指针”,则结果的类型为“类型”。如果为指针指定了无效值,则一元*运算符的行为未定义。102)

  • 102)因此,
    &*E
    相当于
    E
    (即使
    E
    是空指针),并且
    &(E1[E2])
    相当于
    ((E1)+(E2))
    。如果E是一元
    &
    运算符的有效操作数的函数指示符或左值,
    *&E
    是一个函数指示符或等于
    E
    的左值,这一点总是正确的。如果
    *P
    是左值,T是对象指针类型的名称,
    *(T)P
    是左值,其类型与
    T
    所指向的类型兼容

    一元
    *
    运算符取消引用指针的无效值包括空指针、与指向的对象类型不适当对齐的地址以及对象在其生命周期结束后的地址


    在第一个示例中,您将
    p
    设置为0,这在大多数实现中与
    NULL
    相同。然后尝试取消引用该指针(读取/写入
    p
    指向的内存位置),这将导致核心转储
    p
    未指向字符
    a
    。这个
    *p='a'
    表示“取
    p
    指向的内存位置并将
    a
    放在那里”

    在第二个示例中,您将
    p
    设置为
    output
    的地址,因此它指向一个已知的内存位置。然后,当您取消引用时,您正在读取
    p
    点位置的值,即
    输出
    。这是一种有效的用法。

    指针是一种“特殊”变量,用于存储其他变量的地址。看看这个程序,我希望它能帮助你澄清什么是指针以及如何使用它:

    #include <stdio.h>
    
    int main(void){
    
            int x = 10, *pointer = 0;
    
            pointer = &x;
    
            printf("\nThe address of x : %p.\n", &x);
            printf("\nThe address of the  pointer : %p.\n", pointer);
    
            printf("\nThe value of x : %d.\n", x);
    
            *pointer += 10;
    
            printf("\nThe value of x after we modifed it with the pointer : %d.\n\n", x);
    
    return 0;
    
    }
    
    #包括
    内部主(空){
    int x=10,*指针=0;
    指针=&x;
    printf(“\n x的地址:%p.\n”,&x);
    printf(“\n指针地址:%p.\n”,指针);
    printf(“\n x的值:%d.\n”,x);
    *指针+=10;
    printf(“\n使用指针修改后的x值:%d。\n\n”,x);
    返回0;
    }
    
    如果编译并运行此程序,这将是其输出:

    x的地址:0xbf912108

    指针的地址:0xbf912108

    x:10的值

    用指针修改后的x值:20


    可以清楚地看到,指针的地址与变量本身的地址相同。这就是为什么当你修改一个指针时(例如在我的程序中,我做的是
    *指针+=10
    ),它实际上是在修改变量。

    你所说的“去引用”是什么意思?
    printf中的
    *p
    (“指针p中的值是%c\n”,*p)取消对指针的引用。指针是一个引用,因此您正在取消引用或访问指针指向的数据,在本例中,指针不指向任何数据,因此不存在指针。因此,在我的程序1中,指针不指向任何数据?它不应该指向字符“a”吗?不,它应该指向可以存储字符的内存
    'a'
    请参见编辑。指针变量“指向”另一个变量。也就是说,给定:
    charv;char*p然后
    p=&v
    p
    设置为
    v
    s地址(“指向v”)。遵从
    p
    *p
    )就是访问它所指向的变量中的内容(
    v
    )。所以,
    *p='x'
    将字符“x”放入
    v
    printf(“%c”,*p)
    将打印
    v
    中的任何字符(本例中为“x”)。请阅读更多书籍和C示例,然后询问初学者的问题。这里不需要解释,至少在所有书籍和教程中都找不到。只需了解
    *p
    p
    之间的区别。仅此而已。我认为
    NULL
    指针必须是
    (void*)0x00
    ,请阅读C11标准草案第6.3.2.3节第3段。
    说“获取p指向的内存位置并在那里放置a”。
    这是因为
    *
    *p
    前面发生的,但当您说
    p=“a”时也不会发生
    。基本上,这意味着他需要了解他们之间的差异<
    #include <stdio.h>
    
    int main(void){
    
            int x = 10, *pointer = 0;
    
            pointer = &x;
    
            printf("\nThe address of x : %p.\n", &x);
            printf("\nThe address of the  pointer : %p.\n", pointer);
    
            printf("\nThe value of x : %d.\n", x);
    
            *pointer += 10;
    
            printf("\nThe value of x after we modifed it with the pointer : %d.\n\n", x);
    
    return 0;
    
    }