C指针的问题

C指针的问题,c,pointers,C,Pointers,事情是这样的。我有一个大的字符数组,并试图操纵它。下面是我用来测试这个想法的一些代码: #include <stdio.h> char r[65536],*e=r; main() { e+=8; while(*e) { *e+=1; e+=5; *e-=1; e-=1; } *e+=1; printf("%i",*e); printf(" %c",e); } 相对于

事情是这样的。我有一个大的字符数组,并试图操纵它。下面是我用来测试这个想法的一些代码:

#include <stdio.h>

char r[65536],*e=r;

main() {
    e+=8;
    while(*e) {
        *e+=1;
        e+=5;
        *e-=1;
        e-=1;
    }
    *e+=1;
    printf("%i",*e);
    printf(" %c",e);
}
相对于

40 (   
^^8x5=40,这就是它应该显示的内容

接受任何提示/建议/批评。

“将第一个元素设置为8”将被删除

“移动到下一个单元格”将是

等等

使用
e
访问指针,即地址。递增/递减将前后移动指针

使用
*e
可以访问它所指向的值(取消引用)

在大多数情况下,你都在以相反的方式使用它

备注:注意在
e
的声明中,您必须写入
char*e=r
初始化指针(不是值)。这里的
*
指定
e
的类型。声明内容如下:
e
是指向
char
的指针,其值为(e的地址)
e
——类似于
char*r;r=e

*e
取消对指针的引用;也就是说,它操纵指向的值。操纵指针本身意味着直接操纵
e


当您执行
e+=5
时,您将指针向前移动了5个空格,如果执行
*e+=5
,那么您将向指针指向的值添加5。

您取消引用的正是您应该而不是的位置,反之亦然。你想做的是:

*e+=8;
while(*e) {
    e+=1;
    *e+=5;
    e-=1;
    *e-=1;
}
*e+=1;
printf("%d",e - r); //index
printf(" %p",e); //pointer value      
printf(" %c",*e); //pointee value

*
检索指针指向的值。

您误解了指针算术和解引用


*e
用于访问
e
指向的内容,因此
*e+=1
增加
e
指向的内容的值,而不是指向下一个地址。另外,
e+=8
增加了实际指针,
e
现在将指向数组中的第九个条目。

您混淆了解引用。调用指针时,
*
运算符将为您提供存储在该位置的数据。如果没有它,则为您提供地址。

\include
#include <stdio.h>

char r[65536], *e=r;

int main()
{
    *e = 8;
    while (*e) {
        e++;
        *e += 5;
        e--;
        *e -= 1;
    }
    e++;
    printf("%p %c\n", e, *e);
    return 0;
}
字符r[65536],*e=r; int main() { *e=8; 而(*e){ e++; *e+=5; e--; *e-=1; } e++; printf(“%p%c\n”,e,*e); 返回0; }
可能的解决方案:

#include <stdio.h>

char  r[65536];
char* e = r;

main() {
    *e = 8;
    while(*e) {
        e++;
        *e+=5;
        e--;
        *e-=1;
    }
    e++;
    printf("position : %i\n",e-r);
    printf("value : %c\n",*e);
}
#包括
charr[65536];
char*e=r;
main(){
*e=8;
而(*e){
e++;
*e+=5;
e--;
*e-=1;
}
e++;
printf(“位置:%i\n”,e-r);
printf(“值:%c\n”,*e);
}
你只是简单地混合了*和&

如果p是指针,那么*p是指针指向的值。
如果V是一个值,那么&V是存储该值的地址。

您几乎得到了它,但当您用*e定义指针时,您不需要将其称为*e,而只需将其称为*e,这就给出了指针的内存地址。当您再次使用*e+=8对其进行*e处理时,您将取消对它的引用,并将8添加到ASCII值字符中,使其成为其他字符。请注意,
main
应返回一个
int
(通常为0)。您还应初始化数组。不能保证在
*e+=8之后*e是8@user606723:有保证。只有自动变量(非静态“局部变量”)不会自动初始化。是否初始化全局变量?你每天都会学到新东西。那么,是用
*e
而不是
e
?我真的很困惑。*部分是指数值还是位置?编辑:它起作用了,我用
e
s关闭了所有
*e
s,反之亦然。谢谢<代码>e
是位置
*e
是值。不是“精确”。
while
的控制条件正确。
*e+=8;
while(*e) {
    e+=1;
    *e+=5;
    e-=1;
    *e-=1;
}
*e+=1;
printf("%d",e - r); //index
printf(" %p",e); //pointer value      
printf(" %c",*e); //pointee value
#include <stdio.h>

char r[65536], *e=r;

int main()
{
    *e = 8;
    while (*e) {
        e++;
        *e += 5;
        e--;
        *e -= 1;
    }
    e++;
    printf("%p %c\n", e, *e);
    return 0;
}
#include <stdio.h>

char  r[65536];
char* e = r;

main() {
    *e = 8;
    while(*e) {
        e++;
        *e+=5;
        e--;
        *e-=1;
    }
    e++;
    printf("position : %i\n",e-r);
    printf("value : %c\n",*e);
}