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);
}