C 取消引用指针*p vs(“%s”,p)

C 取消引用指针*p vs(“%s”,p),c,pointers,C,Pointers,我是C语言的新手,目前正在学习指针。我所知道的是指针基本上是一个包含另一个变量地址的变量,要获取其数据,我们需要解引用指针: int i = 10; int *pi = &i; printf("%d",*pi); 但在观看yt的一些教程时,我也看到了 char *p = "Hello"; printf("%s",p); //print out Hello// 我自己也测试过 int *i = 10; printf("

我是C语言的新手,目前正在学习指针。我所知道的是指针基本上是一个包含另一个变量地址的变量,要获取其数据,我们需要解引用指针:

int i = 10;
int *pi = &i;
printf("%d",*pi);
但在观看yt的一些教程时,我也看到了

char *p = "Hello";
printf("%s",p); //print out Hello//
我自己也测试过

int *i = 10;
printf("%d",i); //print out 10//

我搜索过它,知道它是一种只读存储器,而不是char[]。但这里的p和i是指针,它们如何直接与%s和%d一起工作,而不去引用*i*p。有人能给我解释一下吗?

指针不一定包含另一个变量的地址,它包含一些数据的地址,这些数据可以但不需要在变量中。例如,指针可以指向动态分配的数据,或者指向作为数组一部分的数据,或者指向可执行文件附带的静态数据

char*p=“hello”
的情况下,
p
指向编译器准备的字符数组的第一个字符,其中包含字母
hello
,后跟一个终止的零字符。
%s
说明符设计用于接收这样一个指针并将字母打印到零字符,这就是它工作的原因


第二个示例中,您使用
%d
打印指针,这在本质上是完全不同的。它滥用了地址具有整数表示的事实,
T*x=
隐式地将整数强制转换为相应的内存地址。在本例中,您创建了一个指向无效地址10的无效指针。然后继续使用
%d
说明符调用
printf
,而不取消对指针的引用。由于
%d
需要一个整数,并且地址在内部也表示为整数,因此这会打印指针指向的无效地址10。但是,指针和整数没有兼容的内存表示形式,因此这种代码只能在偶然情况下工作,并且表现出未定义的行为。

为了概括已经给出的答案,指针只是一个包含内存地址的变量。代码如何尝试使用该内存地址取决于您为其提供的上下文。指针可以以函数指针的形式指向数据,甚至代码。您甚至可以将任何想要的任意值分配给指针,代码将尝试使用它,尽管这可能会失败或产生不可预测的结果

*-represents value at certain variable.
&-represents address of certain variable.
*p=10 let's say the address of p might be "662543" so now by you have stored the value 10 in the address "662543".
and nor if you print 
*p - output will be 10, and
&p- output will be 662543.
and talking about the % sign its a format specifier. like %d for integer, %f for float and %s for string etc.

and difference between %d and %i is as follows-

%d takes integer value as signed decimal integer i.e. it takes negative values along with positive values but values should be in decimal otherwise it will print garbage value.( Note: if input is in octal format like:012 then %d will ignore 0 and take input as 12) Consider a following example. 
 
%i takes integer value as integer value with decimal, hexadecimal or octal type. 
To enter a value in hexadecimal format – value should be provided by preceding “0x” and value in octal format – value should be provided by preceding “0”. 
这样做完全合法:

int *i = (int *)0x12345678;

取消引用该指针(
intx=*i;
)也是完全合法的,但几乎肯定会失败,因为
0x12345678
可能不是代码运行时有效的地址。即使是这样,C编译器生成的代码也会试图以与存储在那里的内容不一致的方式访问这些字节。在上述情况下,如果您使用的是32位x86,那么代码将把从
0x12345678
开始的4个字节解释为小端格式的32位有符号整数。无论实际存在什么,都可能不会产生可用的值。

以下是带数组的指针示例

enter code here

#include<stdio.h>
#include<conio.h>
void main()
{
    int x,*px,i,**pxx;
    x=10;
    px=&x; //Right Way To iniFor Pointer
    pxx=&px+1; //store address of another pointer
    clrscr();//we use px+1 because have 2 address 1 is x and 2 px

    printf("\n\n passed value of x in pointer");
    printf("\n\n the value of x:-%d",x);
    printf("\n the value of px:-%d",*px);//Using * u access a value
    printf("\n the value of pxx:-%d",**pxx);

    printf("\n\n the address of pointer variable");
    printf("\n\n the &x address:-%p",&x);
    printf("\n the px &address:-%p",&px); //using %p Or %x Acces address
    printf("\n The address of pxx:%p",&pxx);
    for(i=0;i<5;i++)
    {
        px=px+1;
        *px=i;
        printf("\n%d %p",*px,px);
    }
    printf ("\n\nThe array of Pointer\n");
    for(i=0;i<5;i++)
    {
        pxx=pxx+1;
        printf("\n%d %p",*pxx,pxx);
    }

    getch();
}
在此处输入代码
#包括
#包括
void main()
{
整数x,*px,i,**pxx;
x=10;
px=&x;//指向指针的正确方法
pxx=&px+1;//另一个指针的存储地址
clrsc();//我们使用px+1,因为有2个地址,1是x,2是px
printf(“\n\n指针中x的传递值”);
printf(“\n\n x的值:-%d”,x);
printf(“\n px:-%d”的值,*px);//使用*u访问值
printf(“\n pxx的值:-%d”,**pxx);
printf(“\n\n指针变量的地址”);
printf(“\n\n&x地址:-%p”,&x);
printf(“\n px&地址:-%p”,&px);//使用%p或%x访问地址
printf(“\n pxx的地址:%p”,&pxx);

对于(i=0;i一些提供指针基本讨论的链接可能会有所帮助。并且(忽略标题,答案讨论指针基本知识)您的情况的区别是
%d
需要一个整数作为参数,而
%s
需要一个指针
:)
int*i=10;
指定地址
10
作为指针
i
的值。它可能超出程序的任何有效内存范围。10基本上被视为指针。然后它再次被视为
int
。这两种转换都是错误的。请始终使用编译器的警告。我使用
-Wall-Wextra-pendantic
gcc
/
clang
。代码基本上是垃圾,只是碰巧给出了“预期的”结果。
int*i=10;
如果您在这一行中没有得到警告,那么请提高编译器警告级别。可以提问——欢迎来到stackoverflow:)我建议您选择一本关于C的介绍性书籍并阅读它。将解释字符串和指针的基础知识,并且(在我看来)由于C是一种貌似棘手的语言,因此通过自己的方式和依靠internet教程来正确学习C是相当困难的。这里有一个很好的书籍列表:关于
&p-
的部分是错误的。关于%d和%i之间的区别的部分是错误的和令人困惑的。