C语言某经典书,书上关于指针与数组上这样的描述,是不是有问题的?
书上这句话,a和b是指向同一个数组,这不是应该指向数组第一个元素吗?数组名是指针没错,但是它是指向第一个元素的啊,如果按上面写指向数组,那么a+1和b+1 最后都是指向数组之前的那个空间的地址了,但这显然不对啊。
看了看你发的消息,你说的很有道理,那个教程确实不严谨,应该说a指向了b数组的第一个元素。因为a本来就是int类型的指针,而不是int[3]类型的指针。但是a和b确实指向同一个位置,因为b是类似于int*
的一个类型,而&b才是指向整个数组
静态数组的话,数组名就是数组的首地址啊,动态数组还有可能不一样
说法没有错,二者都可以指向同一块内存空间,此时无论是修改a还是修改b数组,可以通过打印检查,二者输出结果完全一样,数组是一段空间内连续的地址,a+1和b+1地址也是一样的,有什么不对呢
书上说的没错。b = a
就是把数组a的地址赋给指针b,因此b和a都是指向a数组。*(a+1)
等价于a[1]
,表示数组第二个元素*(b+1)
等价于b[1]
,同样表示数组第二个元素
关于数组和指针的相关概念,其实你要做一些汇总理解:
1:数组是啥,特定类型的数组其实是特定类型对象然后用连续内存去存储,数组名其实直接表示的是这个连续内存的首地址。
2:指针是啥,指针也区分类型的, 指针其实指向的也是一个地址,
3:对象的概念,对象本身是个值,然后对象的地址本身也是一个值,这两个都是可以赋值的,可以操作对象本身,也可以操作对象的地址。
4:接下来就是理解 数组和指针之间的使用,如你的图片,那样子其实只是把指针指向了数组的首地址,内存没有变。
而你如果要把这个数组中的值换到另一个内存中,你就得对指针做空间申请以及依次赋值了。