这个例子不应该改变内存地址而不是内存地址的值吗?

时间:2017-07-07 11:52:04

标签: c++ arrays pointers dereference chars

在我正在阅读的一本书中,C ++从头开始,在第113页上,writer创建了一个char数组:

myString[80];

然后他使用复制一些charectars的函数:

strcpy(myString,"Hello there");
然后他创建了一个指向数组的指针:

*p1 = myString;

然后他使用偏移量并在该偏移处确定一个值:

p1[4]='c';

我的问题是,p1是一个指针,所以它是一个内存地址,偏移量4给了他前面4个空格的内存地址,这意味着他正在分配字母' c'到内存地址而不是存储在该地址的值。不应该是:

*(p1[4])='c';

基本上,为什么*(p1 + 4)需要解除引用但p1 [4]不需要?

我试图理解这一点,对我来说唯一有意义的是方括号是否作为星号来取消引用指针。这是正确的还是还有其他原因导致p1 [4]不需要被解除引用?

3 个答案:

答案 0 :(得分:3)

  然后他创建了一个指向数组的指针:

*p1 = myString;

假设,通过这个,你实际上是指使用;

声明和初始化p1
char *p1 = myString;
那么你的解释是错误的。 p1是指向char的指针,而不是指向数组的指针。

在此定义中,myStringchar数组的(先前在您的问题中声明的)名称。在初始化

char *p1 = myString;

名称myString将转换为指针。该指针将具有值&myString[0](即myString中第一个字符的地址)。这是p1将获得的价值。

声明

 p1[4] = 'c';
然后

myString的第五个字符(因为索引为零)设置为'c'。因此,结果会将myString[4]更改为值'c'。这意味着myString的{​​前1个字符}将为"Hellc there"

假设上述情况,表达式*(p1[4])='c'将无法编译,因为(p1[4])的类型为char,并且无法使用*运算符取消引用。

从语义上讲,表达式p1[4]相当于*(p1 + 4)。由于p1初始化为&myString[0]p1[4]也等同于myString[4]*(myString + 4)

注意:如果*(p1[4])='c'在您的代码中有效,那么p1[4] = 'c'将无效,这表明我对p1的声明和初始化的假设是正确的 - 尽管你已经省略了这些信息。

答案 1 :(得分:0)

p1[4]将是4个以外的内存地址。

表达式*(p1+4)(完全等同于&)称为左值表达式。我们说左值表达式指定内存位置。或者换句话说,左值表达式与内存位置本身是同义的。您始终可以在左值表达式上使用& address-of运算符,并为您提供指向内存位置的指针。

左值表达式将继续以三种可能的方式之一使用:

  1. 将值存储在指定的内存位置,或
  2. 从指定的内存位置或
  3. 中检索值
  4. 这些都没有。
  5. 没有特殊的语法来区分这三种情况;相反,它取决于左值表达式所属的较大表达式。例如,应用=运算符是第3种情况;出现在赋值运算符decoded = polyline.decode(encoded_polyline.replace('\\\\','\\')) 左侧的是案例1.大多数其他用法属于案例2。

答案 2 :(得分:-3)

*(p1 + 4)被视为myString[80] ,它是"在p1"偏移量为4时的值。

当你声明一个char数组时:

myString[4]

myString是一个指向数组的指针(它指向第一个元素)。因此,当您执行*(myString + 4)时,它也会被视为*(p1[4])

撰写*(*(p1 + 4))意味着if(navigator.geolocation){ //navigator.geolocation.getCurrentPosition is an asynchronous function //we do not know when it will be done //but we can tell it what do do when it finished. //this is why we pass it a function as parameter navigator.geolocation.getCurrentPosition( //this here is your callback function : function(position){ latitude = position.coords.latitude; longitude = position.coords.longitude; alert(latitude + " " + longitude); // only here do we know what latitude and longitude are. } ); //since we are not going to synchronously wait until the getCurrentPosition finishes //any statement at this point gets executed immediately. alert("hey!"); }