定义字符串 && 字符串数组
http://blog.163.com/yunfei_lei@126/blog/static/14086456120119256585698/
定义字符串 && 字符串数组
2011-10-25 18:58:05| 分类: C/C++ | 标签: |字号大中小订阅
1.用指针对二维数组的取值(要写到二维数组区域中)
假设一个一维数组a[]
很显然一维数组取值是 *(a+i) i代表指针的偏移量 a表示的是该数组的首地址
二维数组其实也就如同一维数组 只不过这个一维数组的元素是一个一维数组
所以对于二维数组arr[][] *(*(arr+i)+j) arr+i 是指向到arr中第i个元素
*(arr+i) 就是指向到2维数组中某一个元素 该元素本身又是一个数组
因此综合起来就是*(*(arr+i)+j)
虽然二维数组可以理解为一维数组 但是不能通过 *p=arr 这样的方式去指向
void testArr(){
int arr1[]={1,2,3};
int *p=arr1; //这句话拆开应该是 int *p; p=arr1 最终p才是指针变量
int arr2[3][3]={{1,2,3},{4,5,6}};
p=arr2[0];
int (*pp)[3]=arr2; //虽然二维数组可以理解为一维数组 但是不能像上面那样定义一个指针指向它
//要像这样 定义一个指针数组指向2维数组
pp++; //如果把2维数组看做一个矩阵 这相当于移动到下一行
//指针原本指向 {1,2,3} 这个元素, 现在指向了{4,5,6}
printf("%d",*(*pp+1 )); //输出5
}
2.指向字符串的指针变量
char *str="sdsdsds";
printf("%s", str );
或者
char *str;
str="sdsdsds";
printf("%s", str );
// 注意赋给str的不是字符串 也不是字符 而是字符串的首地址
但是如果换成这样就不行:
char *str;
*str="sdsdsds";
printf("%s", str );
3.字符串指针作为参数(数组复制)
常见做法:
#include "stdio.h "
void copy_str(char from[], char dest[] ){
int i=0;
for (;from[i]!='\0';i++ )
{
dest[i]=from[i];
}
dest[i]='\0';
}
void main(){
char from[]="sdsdsdfsf";
char dest[]="dfdsdgfg";
copy_str(from,dest);
printf("%s",dest );
}
使用指针作为参数
#include "stdio.h "
void copy_str(char *from, char *dest ){
for (;*from!='\0'; from++,*dest++ )
{
*dest=*from;
}
*dest='\0';
}
void main(){
char from[]="sdsdsdfsf";
char dest[]="123";
copy_str(from,dest);
printf("%s",dest );
}
copy_str 中的for循环可以改写为
while ((*dest=*from)!='\0' )
{
from++;
dest++;
}
或者进一步:
while ((*dest++=*from++)!='\0' );
指针的移动
void main(){
char *a="i love rilakkuma";
char *p=a+7; //移动指针
printf("%s",p );
printf("%c",a[5]);//虽然没有定义数组a 但由于字符串在内存中是以数组的形式存放的
//a[5]是按照*(a+5)来执行的
}
输出 rilakkumae
指针数组
#include "stdio.h "
void testArr();
char str[][5]={"Bill","Sam","Jim","Paul","0"};
//定义了一个数组 存放的数组类型是char指针型
//该指针指向一个字符串数组 也就是char型的2维数组
char *Names[]=
{
"Bill",
"Sam",
"Jim",
"Paul",
"0"
};
void main()
{
//Names 本身是一个指针数组 Names是数组名 那么代表的是Names数组第一个元素地址
// *Names 就是根据地址区出地址中的内容
//printf("%s\n", *(&Names[0])); // 也就是说 *Names 和 *(&Names[0]) 一样
printf("%s,\n", *Names ); // 输出Bill, 实际上Names指向的是一个2维数组
char **p=Names; //由于Names本身是一个指针数组 想要指向指针数组 应定义一个2级指针
while(*p!=0 ){
printf("%s\n",*p );
p++;
}
*p=Names[0];
testArr();
}
void testArr(){
int arr1[]={1,2,3};
int *p=arr1; //这句话拆开应该是 int *p; p=arr1 最终p才是指针变量
int arr2[3][3]={{1,2,3},{4,5,6}};
p=arr2[0];
int (*pp)[3]=arr2; //虽然二维数组可以理解为一维数组 但是不能像上面那样定义一个指针指向它
//要像这样 定义一个指针数组指向2维数组
pp++; //如果把2维数组看做一个矩阵 这相当于移动到下一行
//指针原本指向 {1,2,3} 这个元素, 现在指向了{4,5,6}
printf("%d",*(*pp)+1 ); //输出5
}
示例2
#include "stdio.h "
void main(){
char arr[]={"123"};// 或者是{'1','2','3' };
char str[][6]={ "i'm"," 28"," year"," old"," my"," dear"," u" }; //注意要指定高维数组的大小 其长度为该数组最长元素的字符个数+1
char *p=arr;
while(*p!='\0' ){
printf("%c",*p);
p++;
}
printf("\n");
char *name[]={ "sss","ddd","ggg" }; //不能写成 *name[]=str
char **pp=name;
printf("%s\n",*pp);//输出sss
printf("%c\n", *(*pp));//或者简写为printf("%c\n", **pp); //输出s
int i=0;
while ( i<3)
{
i++;
printf("%s\n",*pp);
pp++;
}
//**pp 两个*的含义
//如果只有一颗* 表示指向字符数据的指针
//两颗* 表示指向字符指针的指针
}
给字符型数组赋值一个字符串
定义一个字符数组
char str[20]="123123";
char str2[20]={'1','2','3' };
但是注意不能像下面这样
char str[];
str="123123";
使用数组的时候,如果在定义数组的同时并没有对其初始化,必须要指定该数组的长度,否则系统不知道如何为其分配空间
要么char str[]="123123"; 要么char str[20]; 不能是 char str[];
如果是通过char str[20];这样的方式定义的数组
后面就不能再通过str={“xxxx”} 或是 str={‘x’, ‘x’, ‘x’, }这样的方式赋值了
目前发现可以这样
char str[3];
str[1]='2';
//。。。。
难道C语言中就不能先顶一个字符串然后在用的时候再赋值吗?
当然可以 用strcpy这个函数
strcpy(str,"address" );
< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
strcat 的使用
char s3[]="sss";
char s4[]={"345"};
//printf("%s\n",strcat(s3,s4) ); // 和下面用指针输出的效果相同
char *s5=strcat(s3,s4);
printf("%s\n" ,s5);
转载于:https://www.cnblogs.com/wb118115/p/3172001.html
定义字符串 && 字符串数组相关推荐
- c语言 字符串数组末尾,C语言中,利用宏定义一个字符串和字符数组定义的字符串其末尾都会自动添加\0字符...
利用宏定义一个字符串#define MYPHONE "AT+CMGS" 字符数组的方式来定义一个字符串unsigned char SMS[]="HELLO, WELCOM ...
- java初始化字符串数组_在java中如何定义一个字符串数组
展开全部 1. java中定义一个字符串数组方式如32313133353236313431303231363533e59b9ee7ad9431333366306465下,string类型和其他基本类型 ...
- php7 数组与字符串,第7天 PHP字符串、数组
11. 字符串详解 11.1. 4种不同形式的字符串 11.1.1. 单引号字符串 形式: $s1 = '字符串内容' 特点: 只能使用2个转义符: \n \t ' " \(代表一个反斜杠) ...
- JAVA关于字符串字符数组处理的小题目
JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- Java数据结构和算法:字符串、数组和广义表
数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...
- android 数组赋值字符串_c++数组使用
前言:数组是我们存储数据最常用的数据结构,如通信中发送和接收大量16进制数据:存储需要处理的时序数据等.数组的类型是多种多样的,如16进制类型,int类型,float或double类型(按照数据最大值 ...
- C 语言里的字符串---字符数组
// 实际上, c中并没有字符串这种数据类型, 也就是说c是没有像java, .net等其他高级语言中常用的String类型. 首先要强调: a. c语 ...
- Java程序员从笨鸟到菜鸟之(一)开发环境搭建,基本语法,字符串,数组
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 今天进行第一块的复习,首先是环境的搭建,java开发的首先任务就是环境变量的配置和环境的 ...
- C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt
C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...
最新文章
- Python学习 day01打卡
- 开发日记-20190828 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 4
- ActiveX中添加对话框并显示
- cc2530定时器和捕获比较_STM32学习日志——输入捕获实验(20.06.26)
- [NOIP 2010普及组 No.3] 导弹拦截
- Fraction Construction Problem(拓展欧几里德)
- java多文件post请求_如何使用Java发出多部分/表单数据POST请求?
- Thinkpad Access Connections实现快速的在各种网络间进行切换
- ionic4 双向绑定
- 通过XMPP协议实现推送信息
- linux 编写脚本按小时删除日志
- 2008年管理软件行业的七大趋势预测
- python调用通达信函数用户指标_通达信自定义指标调用
- 游戏HTML翻翻乐,大班益智游戏翻翻乐教案
- nimi SearchEngin 项目思路及算法
- SQLiLab刷题记录
- 2019上半年软件设计师考题整理
- 一维振动信号的时域特征python
- java等待3秒_java-selenium三种等待方式
- 温故知新(Java项目)
热门文章
- 多线程编程(3): 使用互斥锁同步线程
- ToolBox系列工具之Detector
- vue:axios二次封装,接口统一存放
- 蓝桥杯 ADV-88 算法提高 输出正反三角形
- java如何将表添加到文本区_java – 在itext中向表中的单元格添加更多文本
- ugui获取坐标_UGUI源码解析(六)Raycast
- Oracle 中给表添加主键、外键
- Java 里面 final 与 static
- 理解 Nginx HTTP 代理, 负载均衡, Buffering, Caching
- 710. Random Pick with Blacklist - LeetCode