我理解指针如何工作的基础知识,但以下示例让我感到困惑。
int *myNum = 10; // Produces an error
char *myChar = "Something"; // Works fine
为什么分配char工作但整数没有(可能导致char被视为数组)?
在直接分配指针变量时,是什么让我感到困惑,它会自动获取地址吗?
char *myChar = "Something";
和
char myChar = "Something";
char *charAddr = &myChar;
这里有什么区别,或等于?
答案 0 :(得分:20)
"Something"
基本上是简称:
static const char some_hidden_array[] = {'S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', '\0'};
some_hidden_array
也就是说,当您编写"Something"
时,编译器会在后台生成一个数组,并为您提供指向该数组开头的指针。由于这已经是一个指向char的指针,因此您可以将它分配给类型"指向char"的指针的变量。 (写作char*
)。
10
对于类似的东西,不是 的缩写。它只是数字10 - 它不是指向包含数字10的数组的指针,或类似的东西。
请注意,char
是单个字符,而不是字符串,这就是为什么字符串语法与大多数其他类型相比不常见 - 字符串几个 chars,而不仅仅是一个。如果您尝试使用普通的char
,您会看到同样的事情:
char *myChar = 'a'; // error
或任何其他类型:
float *myFloat = 42.1f; // error
换句话说,10
给出错误并不奇怪 - 如果有的话,"Something"
不会很奇怪>。 (至少,在你知道字符串文字如何工作之前,这很奇怪)
答案 1 :(得分:10)
这是同样的事情(编译器没有发生任何魔法)。默认情况下,像10这样的文字是int值,而不是int *。
你需要施放:
int *myNum = (int*)10; // Need to cast
char *myChar = "Something"; // No need to cast "..." is already a char*
请注意,引用指向绝对值的指针是很危险的,因为你最终会得到CPU内存中的地址10。
关于你的第二个问题,“......”在内存中被视为一个连续的char序列,类似于数组,相当于char *。
为了深入理解C,数组和指针之间的指针和差异,你应该读一下:专家C编程:Peter van der Linden的深层C秘密。
答案 2 :(得分:2)
执行 <div id="section1">
<h1><London></h1>
<p>London is the capital city of England. It is the most populous city in the United Kingdom,
with a metropolitan area of over 13 million inhabitants</p>
</div>
<div id="section2">
<h2><London></h2>
<p1>London is the capital city of England. It is the most populous city in the United Kingdom,
with a metropolitan area of over 13 million inhabitants</p>
</div>
</div>
#section1
{
float:center;
padding:5px;
background-color:lime;
margin-left:20px;
width:300px;
}
#section2
{
float:right;
background-color:lime;
margin-left:10px;
width:300px;
}
时,在内存中的某处创建一个只读字符串文字,以空字符结尾。现在这对于编译器来说是特殊的,它解释了一连串存储的'char'变量,并以null字符作为字符串结尾。所以基本上你创建了一个字符数组,当你执行char *myChar = "Something";
时,它会返回字符串。
对于整数或任何其他数据类型,它将*myChar*
区分为整数,将int *ptr
区分为整数。您收到错误可能是因为您输入的地址可能无效/可用。
另外,做
int ptr
请注意,char myChar = "Something"; //this is an error, since char can hold one character
char *charAddr = &myChar;
和myChar
是相同的,因为&myChar
是一个指针!
编辑:请参阅此处有关字符串文字的信息: Is it possible to modify a string of char in C?
答案 3 :(得分:2)
为什么分配char工作但整数没有(可能导致char被视为数组)?
你是对的,"Something"
是一个字符串文字,可以视为char数组。在char *myChar = "Something";
之后发生以下事情:它被分配 length + 1 字节的内存,其中"Something"
将被存储,myChar
指向此的起始地址记忆。字符串文字有些特殊。
以下是使用常量值初始化数组的一般方法:
// valid initializations;
char s2[] = { 'a', 'b', 'c' };
int a[] = { 1, 2, 3 };
char s1[] = "123";
在直接分配指针变量时,是什么让我感到困惑,它会自动获取地址吗?
是
答案 4 :(得分:1)
虽然理论上第一个## ....
LBB0_1: ## =>This Inner Loop Header: Depth=1
movl -4(%rbp), %edi
callq __Z11RecFunctioni
jmp LBB0_1
## ....
是有意义的 - 特别是如果你知道在地址十处有一个有用的int *myNum = 10
它通常很少有用并且可能非常危险。
但是,某些指针分配被广泛使用且非常安全:
int
在99.9%以上的现代CPU架构中,这与
相同int *myNum = 0;
请参阅int *myNum = NULL;
here中的NULL定义。
作为一般规则,指针变量的赋值最好通过设置其他内容的地址来完成。
<stddef.h>