P包含一个地址和数据类型,初始地址为0xN的时候每自增一次 P地址就向后偏移一个数据类型的大小 比如说int值有4个字节,那么P+1 的地址就是0xN+4,又或者是double类型就是0xN+8
按照你输入的顺序进行归类,也就是说你输入的顺序是怎么样的,输出就会怎么样,比如说你输出一个char,一个int,输出时就会自动优化先输出char,再输出int。
我自己理解了,,P[4]代表的是确定的变量,这里表示array[1],指针并没有移动
伴随着i的自增,p也会自增(p++),不是单纯的偏移,而是每次自增偏移一位后又赋给p,p的值本身发生了改变,往后移了一个地址(p本身就是执行int型的指针,所以每次偏移都是跨越一个int的长度,即四个字节,指向内存中存储的下一个变量)。这时在去*p,就是访问的内存中a之后的存储的下一个int变量了。
一个字节
对的·
int array[3];
array[0]=1;
array[1]=10;
array[2]=100;
/*这样是对的*/
会存在差异。
系统会有差异,编译器也会有差异。
有编译器优化,也有处理器优化。我的array地址在a的前面。
编译器版本不同,cpu不同,都会造成差异。
总之,指针别乱用。
*p开始是指向a是吧.因为是在循环里打印的嘛.第一个输出*p=3这是a 的值 没有错吧.而这时候i的值 是0.到了第二次循环.i的值 就变成了1哦.p++了就指向了第二个地址也就是i所在的地址了.所以输出的值 是1了.希望能帮你理解..
a是一个变量,不是地址; &a的意思是(&是取地址符)去变量a的地址
重点来了 : *p代表的是值 不是地址 p代表的才是地址
int* p=&a 可以理解为 int* p , p=&a
之前做了6次的p++的指针操作,在新的循环开始之前,要把p指向的位置重新挪回指向a的地址
我也不一样
那个是他的编译器的原因,个人理解,我的顺序就不是
在5.1老师有讲,是GCC的优化,i是整形,在地址a之后。i初始0,循环一次后指针指向i,此时I+1=1
箭头指向就是栈顶 也就是低地址
栈由高到低 堆由低到高
理解正确!
已明白了
我按楼主程序运行,在Linux下同样出现相同的情况,执行到循环时,gdb也不能打出值来。换了c-free ,第三个输出就出现莫名的值,我认为这是编译器的问题。
p[4]=101代表从初始位置(a的地址就始)以四个字节为一步,向前走4步,到达某个位置,然后对这个位置进行初始化赋值,即把101赋给这个地址所代表的内存空间。p[4],*p=101,p[4]代表从初始位置(a的地址就始)以四个字节为一步,向前走4步,到达某个位置。*p=101,代表此时指针指向的地址(即走了四步后所在位置)并对这个地址所在的内存空间进行初始化,赋值101。p+=3于p=p+3等同,加的是步数,原理跟p[3]一样
对于这个问题 请教了一些大神 给我的答案是:在你调试的时候,系统运行在保护模式,内存不会溢出。你所看到的地址其实是系统映射出来的,实际上不存在。你以为你在访问某地址 其实并没有真正访问具体的内存地址
首先,int *p, *表示p是一个指针变量,int 表示指针p指向整形变量。
其次,C语言规定指针变量占四个字节,四个字节里面(如p)存放的是指向的变量的地址值(a的地址值,好比家的门牌号)
编译器不会对数组访问越界进行检查。
因为数组和指针是有密切联系的,很多时候编译器无法确定你访问的位置是否在合理的范围内,所以编译器就干脆对此不检查了。 实践中,有经验的程序员经常活用这种数组和指针的关系。
当然,你这两行代码确实是错的,对array[3]的访问确实越界了。虽然能编译通过,但运行时可能会发生错误。
这是因为int array[2]还有一个为'\0'的结束数组符,而int array[]={0,1}则没有'\0'这个结束符
可能老师手误吧,不过不影响,重点不是那个,是讲的指针的用法