一、字符数组同时做形参和实参

有时候我们需要通过调用一个函数实现对一个传入的数组进行赋值,从而改变其值。当字符数组本质是上也是指针。

 void change(char p[]){strcpy(p, "efgh");//p[0] = 'e';//p[1] = 'r';}
int main (int argc, const char * argv[]) {char buf[] = "abcd";change(buf);printf(buf);return 0;
}

这个就是字符数组做形参,值得注意的是,字符数组初始化的时候,C中会自动在d后面添加‘\0’;change()
函数中将buf的内容改了。可以用strcpy(),或者逐个赋值,或者,sprintf()均可。这种是最初学习的,很简单,但是据说效率不高(这点存疑,因为本质上还是指针,所以不知道到底为什么效率不高?)

二、字符指针同时做形参和实参

void change(char p[]){strcpy(p, "efgh");//p[0] = 'e';//p[1] = 'r';//sprintf(p, "%s", "abc");//printf(p);}
int main (int argc, const char * argv[]) {char* buf= NULL;buf=malloc( 50);change(buf);printf(buf);free(buf);return 0;
}

跟字符数组做实参有一点不同的是,字符指针需要主动分配内存,buf=malloc( 50);并且分配的内存是在堆上的。
上面是字符数组做的形参,
change()的参数也可以换成 void change(char* p);即字符指针做形参。
一样的,本质上都是指针;
这里的字符指针跟上一篇的整数型指针是有一些不同的。
很容易忽略的一点是:
*字符指针赋值的时候,不可以使用char p=“abcd”;类似的样式,例如:

void change(char p[]){strcpy(p, "efgh");//p[0] = 'e';//p[1] = 'r';//sprintf(p, "%s", "abc");//printf(p);}
int main (int argc, const char * argv[]) {char* buf="abcd";change(buf);printf(buf);free(buf);return 0;
}

运行就会报错。
这是因为,一旦使用 char *buf=“abcd”;赋值,是在静态存储区分配内存;等价于 char *buf=NULL; buf=“abcd”;
也就意味着,一旦使用这种方式初始化字符指针,在静态存储区开辟的内存,整个程序运行期间都不可以再更改,后续的在change()中,一旦更改该数值,即会报错。

总结

**在使用字符指针时,要特别注意,你是否后续会更改该字符串的值,若需要更改,不要使用char buf=“abcd”;
这种方式初始化,要么使用char buf[],字符数组;要么使用char buf=NULL;buf=malloc(大小).这与整形的不同

字符数组和字符指针做形参(字符型指针)相关推荐

  1. 编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置

    编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的"随机步法".程序必须随机地从一个元素"走到"另一个元素,每次都向上.向下.向左或向右移动一个 ...

  2. C++ 不能通过给字符数组名赋值的方法给字符数组赋值

    已知有数组定义:char a[3][4]; 形如:"a[0] = "AAA";"的赋值语句是错误的,因为在C++中,无法通过给字符数组名赋值来实现给字符数组每一 ...

  3. 小心地放开玩字符串/字符数组(二)某类字符的个数

    /* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:徐凯旋 * 完成日期:2012 年 12 ...

  4. c 语言往字符数组里面赋值,关于c 语言字符数组的赋值

    首先,在语法上,三句都是正确的,但按照C语言中字符串的用法,第二句是错误的,可能导致无法预料的错误结果. 在C语言中,我们一般说的字符串,其实就是字符数组(区别于C++,Java等语言),而用类似ch ...

  5. 指针做形参,形参的传递详解

    一.用二级指针作为函数参数,有两种典型情况: 1.需要传递一级指针的数组时: 例如标准C的main函数: int main(int argc, char*[] argv),数组最高维可以退化,char ...

  6. C语言补漏:字符串指针与字符数组传参

    字符串指针与字符数组传参 深信服的笔试上被吊打,其中对一道用指针做形参的题目印象十分深刻,借此恶补了一晚上指针,今天总结,以作警示. ​ 试想有如下情形,将一个字符串指针做形参赋值函数修改其字符串,函 ...

  7. 字符 字符串 字符数组 字符串指针 指针数组

    一.字符指针.字符数组 字符指针:字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束. char *ps=" ...

  8. [cpp] 字符数组,字符指针,sizeof,strlen总结

    对于字符数组与字符指针: 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0". ...

  9. c++ string 拼接_C++日志(二十五)字符数组、字符数组指针和string类

    C++中字符串的表示方式有很多种,根据自己目前掌握的有三种: 字符数组: 字符数组指针: 标准库string类: 上面几种方式各有优点和缺点,按照自己的观点,如果处理的字符串的任务比较简单,则使用前两 ...

最新文章

  1. 搭建一个通用的脚手架
  2. python canvas获取的图片流数据为空
  3. 温州大学《深度学习》课程课件(十、人脸识别与神经风格迁移)
  4. WordPress 5.0 换回老版”Classic Editor”经典编辑器教程
  5. 前端学习(511):两列布局的第一种方式
  6. IMAX影厅专候天神下凡 巨幕电影2010年观影指南
  7. web前端基础(12js基础介绍)
  8. 辗转相除求最大公约数,最大公倍数
  9. ProgressDialog弹出时的底色变暗(转)
  10. Vue之Promise
  11. 关于面向对象和面向过程等小例子(持续更新)
  12. 传智php网课,传智自动刷网课视频工具
  13. Activiti7使用
  14. jquery fadein css同时用,Fadein,fadeout事件一起使用jquery
  15. 抖音小程序怎么注册?一文看懂抖音小程序注册开发流程
  16. Python Scapy(2.3.1)文档学习(四):高级用法
  17. uni-app开发微信小程序,H5 关于压缩上传图片的问题
  18. Sublime text3常用的快捷键—骚骚的编辑器
  19. 创业者周鸿祎前传(西安交大时期)-看点-@虎嗅网
  20. 如何把数据导入数据库

热门文章

  1. linux hz是多长时间,linux的HZ, Tick, Jiffies
  2. cad超级排孔_家具cad排孔图 爆破排孔图
  3. 小丸子总结数据库基本知识
  4. 【单片机毕业设计】【mcuclub-jj-054】基于单片机的豆浆机的设计
  5. 基于java的坦克大战游戏
  6. web.py——简单而且功能强大的Python web 框架(4):生成表单、获取输入和内容的验证
  7. Oracle版本区别及版本选择!
  8. Linux执行后台work相关
  9. navicat mysql 如何执行脚本
  10. vscode设置2个空格的缩进