有一两件事,一直困惑我,字符指针。 这是长这四年我又缠绵成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指出“初始化语法”的问题! 我没有问题,写我自己的代码,但修改别人的代码时出现麻烦!
在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;
沿“使得从整数指针,未转换”的行。
我们怎样才能直接处理指针对象的内容时,它指向什么或者是像字符指针商店充塞以外的地址!
我觉得困惑的是初始化语法。 这个:
char* charPtr="I cant understand why";
不取消引用charPtr
。 它相当于:
char* charPtr;
charPtr = "I cant understand why";
这两个代码片段存储字符串的地址文字"I cant understand why"
的charPtr
。 没有指向任何发生的指针解除引用。 指针变量,任何类型的,只能存储一个地址。
这个:
int* intPtr=60;
商店的地址60
中intPtr
:没有int
转让或deferencing正在发生。 没有int
变量存在,在这一点上。 编译器应该在发出这条线警告。 任何企图尊重intPtr
将最有可能导致崩溃。
当你写:
char* charPtr = "I can't understand why";
这意味着字符串的基址“我无法理解为什么”被分配到
charPtr因为字符串文字也是一个指针,它指向字符串。
它可以被看作是:
![](https://www.manongdao.com/static/images/pcload.jpg)
这意味着,在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的证明我的理念是,字符串“我无法理解为什么”本身就是一个指向该字符串被存储的字符数组。
你intPtr
被初始化为指向绝对内存地址60
。 这里没有后备存储。
既然你不取消引用指针本身,你从来没有尝试读取地址60
这将取决于环境可能是你的程序崩溃。
相反,你是路过的指针值到printf
这需要相当多的东西作为参数,并为您在格式字符串指定解释值。 在你的情况下,它会解释指针,而不是指针值的地址。 地址是60
,这样显示。 假如你使用*intPtr
,而不是它本来很可能坠毁。