什么是一个指针初始化到?(What does a pointer initialise to?)

2019-06-27 13:01发布

有一两件事,一直困惑我,字符指针。 这是长这四年我又缠绵成C之后。

举个例子所提到的情况。为什么呢char指针的行为以这种方式? 我们怎样才能直接处理指针对象的内容时,它指向什么或者是像字符指针商店充塞以外的地址!

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

int main()
{ 
char* charPtr="I cant understand why";
int* intPtr=60;


printf("%d\n", intPtr); //displays 60
printf("%p\n", intPtr); // displays the hex value of 60

printf("%s\n", charPtr); // displays the wh0le string
printf("%p\n", charPtr); // displays the start address of the string
return 0;

}

接下来, int指针,它怎么能接受值60和它从哪里获得存储在哪里?

撇开字符指针和malloc的,我以为指针的基本想法是得到一个地址指向!

为什么这些案件

 *intptr = 60 ; // should be setting the pointee's value to 60
  intptr = 60 ;  // sets the address

抛出而编译错误

  int* intPtr=60;

潜入在没有得到一个地址(或者是作为地址60,如果是这样,为什么这不能接受不前的情况下)的指针对象的!

我想我在这里的东西,但嘿! 你猜怎么着 ? 他们告诉我,使搜索!

编辑:给指向的地址的字符指针为int的指针也会引发中没有错误!

int8_t* intPtr= (int8_t*)0x80485c8 ; // works without casting too ! I guess addresses are acceptable.

解引用它会给相当于第一个值I的字符串。是一个很好的做法或有任何其他的解释存在于这个离开了thier字节位大小分配,如int可以支持一个char等..?

作为hmjd指出“初始化语法”的问题! 我没有问题,写我自己的代码,但修改别人的代码时出现麻烦!

Answer 1:

在C中, 文字字符串 “我不理解为什么”被存储为阵列char使得存储器是否可用于程序的生命周期(所有地址被拉到凭空,并不意味着表示任何特定平台或体系结构):

Item        Address        0x00  0x01  0x02  0x03
-----       -------        ----  ----  ----  ----
"I..."      0x00080000      'I'   ' '   'c'   'a'
            0x00008004      'n'   '''   't'   ' '
            0x00008008      'u'   'n'   'd'   'e'
            0x0000800C      'r'   's'   't'   'a' 
            0x00008010      'n'   'd'   ' '   'w' 
            0x00008014      'h'   'y'  0x00  0x??

字符串文字也是一个数组表达 ,并且在大多数情况下类型“的N元件阵列的表达T ”将被转换为类型“指针T ”,其值将是该阵列的第一个元素的地址(例外是当阵列表达是的操作数sizeof或一元&运营商,或者是字面被用于初始化的声明的阵列的字符串)。

所以,当你写

char* charPtr = "I can't understand why";

你复制到字符串字面的地址 charPtr

Item        Address        0x00  0x01  0x02  0x03
----        -------        ----  ----  ----  ----
charPtr     0xffbe4000     0x00  0x08  0x00  0x00

请注意,如果已被宣布

char str[] = "I can't understand why";

str将被分配为数组char足够长的时间来保存字符串,字符串的内容会被复制到它:

Item        Address        0x00  0x01  0x02  0x03
-----       -------        ----  ----  ----  ----
str         0xffbe4000      'I'   ' '   'c'   'a'
            0xffbe4004      'n'   '''   't'   ' '
            0xffbe4008      'u'   'n'   'd'   'e'
            0xffbe400C      'r'   's'   't'   'a' 
            0xffbe4010      'n'   'd'   ' '   'w' 
            0xffbe4014      'h'   'y'  0x00  0x??

当你写

int* intPtr = 60;

你与60初始化指针值,而不是将其设置为指向与价值60匿名整数:

Item        Address        0x00  0x01  0x02  0x03
----        -------        ----  ----  ----  ----
intPtr      0xffbe4004     0x00  0x00  0x00  0x3C

地址60是最有可能不是一个有效的地址,因此试图取消引用intPtr将最有可能导致不确定的行为。

假如你写的像

int x = 60;
int *intPtr = &x;

那么你就会有这样的情况:

Item        Address        0x00  0x01  0x02  0x03
----        -------        ----  ----  ----  ----
x           0xffbe4004     0x00  0x00  0x00  0x3C
intPtr      0xffbe4008     0xff  0xbe  0x40  0x04

在这种情况下,值intPtr是的地址x

最后,注意初始化分配是不一样的东西。

T *x = value;

不解除引用x和分配value的结果; 其分配value直接向x 。 的类型的value被视为T * 。 请注意,你应该会得到警告

int *intPtr = 60;

沿“使得从整数指针,未转换”的行。



Answer 2:

我们怎样才能直接处理指针对象的内容时,它指向什么或者是像字符指针商店充塞以外的地址!

觉得困惑的是初始化语法。 这个:

char* charPtr="I cant understand why";

不取消引用charPtr 。 它相当于:

char* charPtr;
charPtr = "I cant understand why";

这两个代码片段存储字符串的地址文字"I cant understand why"charPtr 。 没有指向任何发生的指针解除引用。 指针变量,任何类型的,只能存储一个地址。

这个:

int* intPtr=60;

商店的地址60intPtr :没有int转让或deferencing正在发生。 没有int变量存在,在这一点上。 编译器应该在发出这条线警告。 任何企图尊重intPtr将最有可能导致崩溃。



Answer 3:

当你写:

 char* charPtr = "I can't understand why";

这意味着字符串的基址“我无法理解为什么”被分配到

charPtr因为字符串文字也是一个指针,它指向字符串。

它可以被看作是:

这意味着,在charPtr整个字符串的基址被存储。现在这是你已经在你的代码做了什么。

 char *charPtr="i cant understand why";

添加了这个,如果打印之类的语句:

printf("%c","i cant understand why"[0]);//prints i
printf("%c","i cant understand why"[2]);//prints c

这两个的printf的证明我的理念是,字符串“我无法理解为什么”本身就是一个指向该字符串被存储的字符数组。



Answer 4:

intPtr被初始化为指向绝对内存地址60 。 这里没有后备存储。

既然你不取消引用指针本身,你从来没有尝试读取地址60这将取决于环境可能是你的程序崩溃。

相反,你是路过的指针值到printf这需要相当多的东西作为参数,并为您在格式字符串指定解释值。 在你的情况下,它会解释指针,而不是指针值的地址。 地址是60 ,这样显示。 假如你使用*intPtr ,而不是它本来很可能坠毁。



文章来源: What does a pointer initialise to?