【问题标题】:What is the difference between *p and *&p*p 和 *&p 有什么区别
【发布时间】:2019-12-14 06:49:27
【问题描述】:

这段代码有问题,

int main()
{
 char *p = "example";
 printf("%s\n", *&p);   This is giving desired output
 printf("%s\n", *p);    Here giving segmentation fault
 return 0;
} 

我的问题是这里的 *&p 和 *p 有什么区别以及它们在这段代码中是如何工作的?

【问题讨论】:

  • %s 需要一个指向字符串的指针。 *p 是单个字符,因此是段错误。 &p 是一个指向指针的指针,在使用 * 运算符取消引用后,您将返回原始指针。

标签: c pointers printf operators


【解决方案1】:

*&p 实际上与p 相同,并且类型为 char *。

所以这些电话

printf("%s\n", *&p);
printf("%s\n", p);

产生相同的结果。

*p 的类型为char,不能与格式说明符%s 一起使用。否则将其与格式说明符 %s 一起使用会导致未定义的行为

你可以改写

printf("%c\n", *p);
        ^^

注意*&p并不总是等于p

例如,您不能将运算符 & 应用于 non-lvalue

考虑以下演示程序。

#include <stdio.h>

char * f( void )
{
    char *p = "Hello";

    return p;
}

int main(void) 
{
    printf( "%s\n", f() );
    // The statement below will not compile if to uncomment it
    // printf( "%s\n", *&f() );

    return 0;
}

在这个程序中,函数f返回的临时对象不是左值。

【讨论】:

  • 我会在 char * 周围放置一个代码块,使其更具可读性,但其他方面看起来不错。
【解决方案2】:

&amp;p是变量p的地址,类型为char **。然后值*&amp;p 取消引用此地址,为变量p 提供char * 类型的左值。 *&amp;p 完全等同于 p

*p 正在取消引用变量p。这为p 指向的字符提供了一个char 类型的左值,在这种情况下,'e' 在字符串的开头。 (请注意,虽然它是char 类型,但这个值是只读的,因为p 是一个指向字符串字面量的指针。)

由于默认类型转换,您最终将int 的值'e' 传递给printfprintf 将此值视为地址,因为您使用格式说明符"%s"printf 取消引用此指针,这是无效的内存访问..

【讨论】:

    【解决方案3】:

    在这种情况下:

    1) p 是一个 char 指针,用于存储 address,其中存储了 "example" 中的第一个 'e' 字母 2) *p 是存储在 p 中的那个地址的值,即值 'e' 3) *&p = *(&p) 是p的地址指向的值 那么*&p == p

    然后给出 1,2,3 :

    printf("%s\n", *&p);  // is equivalent to printf("%s\n",p)      which is OK
    printf("%s\n", *p);   // is equivalent to printf("%s\n",'e')    which is wrong 
                          // because 'e' is interpreted as an address
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2013-12-10
      • 2016-01-23
      • 2014-05-30
      相关资源
      最近更新 更多