在我正在阅读的一本书中,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]不需要被解除引用?
答案 0 :(得分:3)
然后他创建了一个指向数组的指针:*p1 = myString;
假设,通过这个,你实际上是指使用;
声明和初始化p1
char *p1 = myString;
那么你的解释是错误的。 p1
是指向char
的指针,而不是指向数组的指针。
在此定义中,myString
是char
数组的(先前在您的问题中声明的)名称。在初始化
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运算符,并为您提供指向内存位置的指针。
左值表达式将继续以三种可能的方式之一使用:
没有特殊的语法来区分这三种情况;相反,它取决于左值表达式所属的较大表达式。例如,应用=
运算符是第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!");
}