C - 指针+ 1含义

dpp*_*dpp 4 c arrays pointers

代码基本上做的是打印指针i和ch指向的int和char数组中每个元素的地址.

#include<stdio.h>

int main()
{
    char *ch;
    int *i;
    int ctr;

    ch = malloc(sizeof(char)*10);
    i = malloc(sizeof(int)*10);

    printf("Index\ti Address\tch Address\n\n");

    for(ctr=0; ctr<10; ctr++)
    {
        printf("%d\t%p\t%p\n",ctr,i+ctr,ch+ctr);
    }

    getch(); 
    return  0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

Index   i Address       ch Address

0       00511068        00511050
1       0051106C        00511051
2       00511070        00511052
3       00511074        00511053
4       00511078        00511054
5       0051107C        00511055
6       00511080        00511056
7       00511084        00511057
8       00511088        00511058
9       0051108C        00511059 
Run Code Online (Sandbox Code Playgroud)

我知道两个数组中的每个元素占用其数据类型的空间大小.我的问题是,我对此操作感到困惑:

i+1
Run Code Online (Sandbox Code Playgroud)

如果i是00511068,则i+100511069因为反对的结果.什么i+1意思?你怎么看的?我想我并不完全理解指针.请帮我理解.谢谢.

Mys*_*ial 10

这是因为int这个系统上有4个字节.所以+1在指针上将它增加4而不是1.

增加指针时,将其增加实际大小而不是指针值本身.

  • 另一种看待它的方法:通过执行i + 1,你实际上将指针递增到指向下一个int - 这意味着如你所说的那样将指针地址递增4.这是由编译器自动完成的.这就是存在类型的原因.这绝对不奇怪,但非常有用和合乎逻辑. (2认同)
  • @domanokz:这就是为什么你有不同类型的指针.一般来说,对`sometype*p`指针进行指针运算会将其偏移为`sizeof(sometype)`,而不是`1`. (2认同)

Phi*_*llo 9

啊,是的,那个老板栗.将N添加到指针时会有一些魔力; 编译器直觉你想要第N个项的地址,并将偏移量乘以数据类型的大小.

  • 我不会称其为“魔法”,这只是指针算术的定义方式。 (2认同)
  • 有时我会觉得这很烦人 (2认同)

Kla*_*äck 5

pointer + j与 相同&(pointer[j]),因此它是 指向的数组中第 j:th 元素的地址pointer。显然,指向大数据类型的指针将比指向小数据类型的指针递增更多。