碰到一个关于char*和字符串的问题,发现以前使用的时候没有很深入的了解,因此做一个总结。
这段代码最后输出的是“test”,但是第一次看的时候感觉func里面传入的地址按道理应该修改的p所指的内存,因此输出的应该是“abc”。同时p是一个char*的指针,为什么可以使用p=“test”这样的操作?不应该报类型不匹配吗?
查询资料发现问题的关键是因为:在C语言中字符串常量的本质表示其实是一个地址!!
(参考csdn博客:深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别)
因此不难理解,第一次的p=“test”是给char*类型的p地址。func传入的确实是p的地址但是func函数内部的p指针并没有修改mian中的p所指的内容,因为也没有*这样的解引用。同时字符串类型为const char[]类型,因此也无法修改字符串地址中的内容。func中的p指针相当于先拿到了main中的p的地址然后在函数里面重新指向了“abc”的地址。但是func走完之后func函数中的局部变量p也就释放了,因此main中的p所指的位置没有影响,输出也就是“test”。