知道初始地址的指针的地址

时间:2018-06-06 02:00:04

标签: c pointers memory-address

我有以下代码:

#create the list of subject ids
SUB_IDS=['values']
# this is a pandas data frame of all subjects' information.  Columns are: 
#Sub_ID, NG,C,ER
asbs=pd.DataFrame(['Values'])
for x in SUB_IDS:

    x_data=asbs[asbs['SUB_ID']==x]

    x_ng=x_data['NG']
    x_c=x_data['C']
    x_er=x_data['ER']

    a,b = sp.stats.kurtosistest(x_NG)
    c,d = sp.stats.kurtosistest(x_C)
    e,f = sp.stats.kurtosistest(x_ER)
    kurtosis_scores.append([x,a,b,c,d,e,f])
    # for somplicity we'll only focus on bootstrapping one feature variable
    if b <=.05:
        mean=x_ng.mean()
    else:
        sampled_means=[]
        for x in range(1,10000):
            g=np.random.choice(x_NG,size=len(x_NG),replace=True)
            print(g)
            g=np.mean(g)
            sampled_means.append(g)
        mean=sampled_means.mean()

“tab”位于从服装0x28FEF8开始的内存区域中。

我知道* ptr-1的值是49,&amp; tab的值是0x28FEF8。

有人能解释一下为什么“ptr”的值是0x28FF08吗?我猜它会是0x28FEFC。

提前谢谢你!

1 个答案:

答案 0 :(得分:4)

如果我们&#34;画&#34;你的数组在内存中显示它看起来像

+----+----+----+----+----+
| 10 | 20 | 30 | 40 | 50 |
+----+----+----+----+----+

然后你需要记住,数组自然地衰减到指向第一个元素的指针,即tab等于&tab[0]。然后你需要记住,对于任何数组或指针a和索引i,表达式a[i]完全等于*(a + i)。由此可以很容易地推断tab + 4等于&tab[4],即指向第五个元素的指针。

因此,如果我们再次绘制数组,但现在使用指针:

+----+----+----+----+----+
| 10 | 20 | 30 | 40 | 50 |
+----+----+----+----+----+
^                   ^
|                   |
&tab[0]             &tab[4]
|
&tab

如果&tab[0]等于0x28fef8,则&tab[4]等于0x28fef8 + sizeof(int) * 4,因为它指向int数组的索引4,并且&确实是0x28ff08

请注意,虽然&tab[0]&tab指向同一位置,但它们在语义上是不同的。 &tab[0]是指向单个元素的指针,类型为int *,而&tab是指向数组的指针,类型为int (*)[5]

在相关说明中,打印void *指针的正确格式为"%p"。所以你的打印应该是

printf("%d,%p,%p. \n", *ptr-1, (void *) &tab, (void *) ptr);

请注意,实际需要转换为void *