字符、字符串、数组

0、字符

  • 转移字符分三种,一般转义字符,八进制转移字符和十六进制转移字符
    一般转义字符,如‘\b’,由两个字符表示,其实代表一个字符,这个代表退格字符
    八进制转义字符,如‘\007’,三位数字是八进制的,ASCII码为7的表示响铃
    十六进制,如'\xfe',同样后面数字是所表示意思的Ascii码的十六进制表示,注意一定要有x,大小写都行



1、字符串数组

char a[3][25]= {"XUANXIU YUWEN ", "XUANXIU YUWEN", "FEIXUANXIU TIYU"};就行了 定义成二维数组存储时可以简单看作一排一个字符串数组,char* a[10] = {"XUANXIU", "YUWEN", "XUANXIU", "SHUXUE", "FEIXUANXIU", "TIYU"};这样是定义了一个指针数组 指针元素分别指向每一个对应的字符串存储的首地址

2、二维数组作为函数参数(二维数组一定要确定列数)

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: 

     void Func(int array[3][10]); 

     void Func(int array[][10]); 

     二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的: 

     void Func(int array[][]); 

     因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的: 

     void Func(int array[3][]);实参数组维数可以大于形参数组,例如实参数组定义为: 

     void Func(int array[3][10]); 

     而形参数组定义为: 

     int array[5][10]; 

     这时形参数组只取实参数组的一部分,其余部分不起作用。 

对于数组 int p[m][n]; 

   如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为: 

   p + i*n + j; 

void Func(int array[3][10]); 

     void Func(int array[][10]); 

   变为: 

     void Func(int **array, int m, int n); 

在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为: 

     *((int*)array + n*i + j); 

     在调用这样的函数的时候,需要注意一下,如下面的例子: 

     int a[3][3] = 

     { 

       {1, 1, 1}, 

       {2, 2, 2}, 

       {3, 3, 3} 

     }; 

     Func(a, 3, 3); 

根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用:   

     Func((int**)a, 3, 3); 

   其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一 个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数 也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。



3、字符指针变量和字符数组的区别:

简单说一下:
字符串数组是用来存放字符串的数组,在内存中占一段连续的单元。所占内存存放的是字符串。定义方法为:char a[N];N为常量表达式,可初始化。字符指针是指向字符的指针,所占内存单元存放的是所指字符的内存单元。定义方法为:char *p;

完整的解答:
1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的地址(字符串第一个字符的地址),决不是将字符串放到字符指针变量中
2)赋值方式
对于字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值
char str[14];
str = "I love you!";
而对于字符指针变量,可采用如下赋值:
char *a;
a = "I love you!";
赋值给a的是字符串第一个元素的地址
3)对字符指针赋初值
char *a = "I love you!";
等价于
char *a;
a = "I love you!";
而对数组的初始化:
char str[14] = {"I love you!"};
不等价于
char str[14];
str = "I love you!";
4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址
char *a, str[10];
a = str;
scanf("%s", a);
先使a有确定值,即使a指向一个数组的首元素,然后输入一个字符串,把它存放在以该地址开始的若干单元中
5)指针变量的值是可以改变的,而数组名是常量
6)用指针变量指向一个格式字符串,可以用它代替printf函数的格式字符串
char * format;
fomat = "a = %d, b = %f\n"
printf(format, a, b);
相当于
printf("a = %d, b = %f\n", a, b);
因此只要改变printf所指向的字符串,就可以改变输入输出格式,这种printf函数称为可变格式输出函数
也可以用字符数组实现:
char format[];
format = "a = %d, b = %f\n"
可以看出,用指针变量指向字符串更简洁

4、字符数组初始化






5、字符

(1)字符‘0’不是0值

(2)字符‘0’如果是返回int型,其值是48(ASCII码);如果返回的是char型,那个其值是字符‘0’。



6、数组特性

(1)数组的大小也可以在运行时确定大小,即动态开辟空间(动态数组)

在C++中创建一维动态数组

用new 和 delete组合来分配存储空间
比如: 
int n;
int *a=new int[n]
;
不过你要记得在最后用delete释放掉哦!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值