首先,数组不是指针。指针不是数组。数组衰减为指针。
1.How both the address is same of s and &s?
char s[]="prady";
--------------------------
s: | p | r | a | d | y | \0 |
--------------------------
该数组s
是一个要求留出 6 个字符的请求。换句话说,s
有 6 个字符。's` 是一个“东西”,它不指向任何东西,它只是。
char *ptr = "prady";
------ --------------------------
|*ptr| --> | p | r | a | d | y | \0 |
------ --------------------------
指针ptr
请求一个存放指针的地方。指针可以指向任何字符或任何字符串文字(连续字符)。
另一种思考方式:
int b; //this is integer type
&b; //this is the address of the int b, right?
int c[]; //this is the array of ints
&c; //this would be the address of the array, right?
所以这是可以理解的:
*c; //that's the first element in the array
那行代码告诉你什么?如果我尊重 c,那么我会得到一个 int。这意味着只是简单的 c 是一个地址。由于它是数组的开头,它是数组的地址,因此:
c == &c;
2. If both are same then how they show different when adding 1 to it.
从我对#1的回答中,我假设您明白为什么它们不一样。那么为什么你会得到不同的值呢?看看你得到的值:
s = 0x3217062327
s+1 = 0x3217062328 // It's 1 bigger, why? Because a char takes 1 byte, s holds chars
// so s (address of a char) + 1 (sizeof char) gives you one more than s
&a + 1 //This is adding 1 (sizeof array) which is bigger than the size of a char
3. How I got segmentation fault in *p.
我想你可以从我之前的两个答案中得到这个......但是:
- p 是指向字符的指针
- 您将 p 设置为数组的地址(记住,是数组本身)
- 对 p 的尊重是指向 char (另一个地址)的指针,但是您不能对数组执行此操作。
当您进行类型转换时,您告诉编译器“我比您更了解,所以只需让这两个工作”。当你出现段错误时......那是因为你真的不知道更好。