无法理解此C指针对arraycode

时间:2016-09-05 13:21:31

标签: c arrays pointers

这是关于数组到指针的代码。 问题是我不理解输出。 根据我研究的内容*p表示地址p处的值包含地址处的*(*p)值(地址p处的值) 那么为什么输出是不同的。

代码:

--------------------------------------------------------------------------- 
 #include<stdio.h>

void main()
{
static int a[ ] = { 0, 1, 2, 3, 4 } ;
int *p[ ] = { a, a + 1, a + 2, a + 3, a + 4 } ;
printf ( "\n%u %u %d", p, *p, * ( *p ) ) ;
}

,输出

3545106368 6293840 0

请帮我理解这个输出。保持简单易用。

2 个答案:

答案 0 :(得分:1)

在内存中,您的数组看起来像这样:


+------+------+------+------+------+
| a[0] | a[1] | a[2] | a[3] | a[4] |
+------+------+------+------+------+
 ^      ^      ^      ^      ^
 |      |      |      |      |
+------+------+------+------+------+
| p[0] | p[1] | p[2] | p[3] | p[4] |
+------+------+------+------+------+

即。 p的每个元素都指向a中的相应元素。

然后你必须知道,当使用数组时,它会衰减到指向其第一个元素的指针,即表达式p&p[0]相同。因此,当您打印p时,您将打印出数组p的第一个元素的地址。

当您取消引用p指定的指针时,您实际上正在执行*&p[0]。运算符的取消引用和地址相互抵消,因此当您打印*p时,您正在打印p[0],这是数组p中第一个元素的值。

该元素p[0]又是a[0]的指针。因此,当您取消引用该指针(在**p中,与*p[0]相同)时,您将获得a[0]的值。

此外,对于任何数组指针p和索引i,表达式p[i]*(p + i)相同。由此得出p[0]*(p + 0)相同,*(p)*p相同,与p相同。

由此可以得出&p[0]*(p + i)相同的逻辑。

由于commutative property的添加,真正让你感到困惑,表达式*(i + p)i[p]相同,导致了特殊但有效的表达式printf

最后但并非最不重要的是,当使用"%p"打印指针时,您应该使用void*格式。它需要printf作为参数,您还需要将指针强制转换为程序。因此,printf ( "%p %p %d\n", (void *) p, (void *) *p, **p ) ; 来电应该是

days = {0:'Mon', 1: 'Tues', 2:'Wed', 3:'Thurs', 4:'Fri', 5:'Sat', 6:'Sun'}
data['day_of_week'] = data['day_of_week'].apply(lambda x: days[x])
data['if_Weekday'] = np.where( (data['day_of_week'] == 'Mon') | (data['day_of_week'] == 'Tues') | (data['day_of_week'] == 'Wed') | (data['day_of_week'] == 'Thurs') | (data['day_of_week'] == 'Friday'), '1', '0')

参见例如this printf (and family) reference了解更多信息。

答案 1 :(得分:0)

p

此处 0 1 2 3 4 | | | | | a a+1 a+2 a+3 a+4 => p printf ( "\n%u %u %d", p, *p, * ( *p ) ) ; 是一个包含指向整数的指针的数组。

p

p是指向a的第一个元素的指针,0(指向*p的指针)

pa的值,0是指向*(*p)的地址。

*a就像0一样,提供了*p

地址的正确说明符是*u而不是var path = require("path"); var Builder = require('systemjs-builder'); // optional constructor options // sets the baseURL and loads the configuration file var builder = new Builder('path/to/baseURL', 'path/to/system/config-file.js'); builder .bundle('local/module.js', 'outfile.js') .then(function() { console.log('Build complete'); }) .catch(function(err) { console.log('Build error'); console.log(err); });