c - 我将字符串作为函数参数传递,我可以在该函数中访问该字符串吗
问题描述
在 C 中,如果我将字符串作为函数参数传递,我将拥有指向该字符串基地址的指针变量。但是我们仍然可以打印作为参数传递的整个字符串。所以我想知道我是否可以访问该函数中的整个字符串而不仅仅是打印它?
void PrintHelloWorld(char *name){
printf("Hello World %s \n",name);
}
int main(){
char x[] = "John";
PrintHelloWorld(x);
}
解决方案
当涉及到字符的内存分配细节时,字符串在 C 中不够精确。可以通过两种方式分配字符串文字:
char a[] = "ABCDE";
char *p = "ZYXWV";
a
是一个“普通”的字符数组。好像是通过首先声明char a[6];
终止的 0 由编译器添加的。
p
是一种特殊情况,因为 5 个字符加上 0 的数组必须存储在某处,但没有数组变量。
差异并不重要,但例如 gcc 决定将这些非对象数组放入.rodata
部分:
String dump of section '.rodata':
[ 4] ZYXWV
String dump of section '.data':
[ 8] @
[ 10] ABCDE
[ 19]
所以
const char *p = "ZYXWV";
是定义只读字符串的更安全、更清晰的方法。
函数声明(char *name)
可以反映:
(const char *name)
声明不会发生任何修改。
(char name[12])
表明一个人期望name
被分配。(编译器需要[static 12]
有所作为)
推荐阅读
- installanywhere - 超过许可的最大允许同时构建
- sql - 如何仅向查询结果中出现的用户发送电子邮件?
- javascript - 如何检测在 Javascript keyup 事件中何时按下 Shift+NumKey?
- c# - 在列表中使用 linq 和 c# 进行分组
- tensorflow - 无法在 Ubuntu 18.04 上使用 apt 安装 TensorFlow - 未满足对 nvidia-driver-418 的依赖
- asp.net - 在循环中执行存储过程是否有更有效的替代方法?
- unity3d - 在 Oculus Quest build 7.0 上无法同时对两个控制器进行跟踪
- python - 如何将给定的字符串转换为数组?
- python - 我们在 OpenCV 和 Python 中有椭圆检测吗?
- python - 计算任何格式的电影剧本中每个角色说的单词数