C++语言--数组-6.1----数组在内存中的分布、数组名和函数、枚举常量
2017-02-05 15:42
288 查看
前言:2017年第一篇博客,祝大家新年快乐!!
1.数组在内存中的分布
我们来分析为什么a[0]=3?在C++中我们知道数组b中的最大下标角为9,当我们赋值给b[10]时,即使在数组b中下标10已经越界,但是
编译器还是会留存四个字节的地址给b[10]存放数值3,而a[0]的数组的存放地址恰恰是b[10]的存放地址,这也是a[0]为什么是3的原因了。
那我们怎么解决这一问题了?C++不同于java,如在java中这么写程序必然会报错,这是因为超出边界的数组无法通过编译。要在C++中
避免这种尴尬的局面,只好由程序员谨慎的规范。
2.数组名与函数
我们知道数组在定义的时候系统会自动创建一个指向该数组的指针,并且该指针自动指向该数组的第一个元素。
从上面我们可以看到,在main函数中我们其实操作的就是x[2]中的内存地址中的值。
3.枚举常量
定义:把变量的值一一列举,变量的值只能取其中的一个。
形式1:
[cpp] view
plain copy
enum city{上海,北京,南京,广州};//city为枚举类型名
city city1,city2;//city1,city2为city枚举类型的变量
形式2:
[cpp] view
plain copy
enum city{上海,北京,南京,广州}city1,city2;
例子:
[cpp] view
plain copy
#include <iostream>
using namespace std;
enum city {beijing, shanghai, shandong, guangzhou=7, tianjin};
void fn(enum city c)
{
switch(c)
{
case 0:cout << "beijing\n" << endl;break;
case 1:cout << "shanghai\n" << endl;break;
case 2:cout << "shandong\n" << endl;break;
case 7:cout << "guangzhou\n" << endl;break;
case 8:cout << "tianjin\n" << endl;break;
default :cout << "非法城市!\n" << endl;break;
}
}
int main()
{
enum city c1, c2, c3, c4;
c1 = (enum city)2;
c2 = shandong;
c3 = beijing;
c4 = (enum city)4;
fn(c1);
fn(c2);
fn(c3);
fn(c4);
cout << c1 << " " << c2 << " " << c3 << " " << c4;
return 0;
}
枚举常量的使用说明:
1.先定义枚举类型,在定义枚举常量,然后使用枚举常量;
2.枚举元素是常量,不是变量,所以不能对枚举元素进行赋值;
3.枚举元素是常量,其常量值不是列举的“内容”,而是定义时的次序号:0,1,......,n;
4.枚举元素值在定义时可以人为指定;
5.枚举变量的值只能取定义枚举类型时所列举的元素之一;
6.尽管枚举元素有值,但是此值并不是整型值,所以不能把整型数赋值给枚举变量;
7.枚举元素不是字符串,可进行逻辑判断比较运算。
4.strcat等系列函数表达的意义
4.1 strcat函数:是string catenate的缩写,即字符串连接。
字符串连接之后数值保存在第一个数组中,第二个保持不变。
我们需要注意的是:
1.第一个数组的字符长度要比第二个大,不然会报错误。
2.每个字符串结尾处都有一个结束标志“\0”。当通过strcat函数连接起来的时候,连接的字符串结尾处也有一个
结束标志“\0”,它是第2个字符串的,而第1个字符串的结束标志则自动取消。
4.2 strcpy函数:是string copy的缩写,即字符串复制。
从src地址开始且含有null结束符的字符串复制到以dest地址开始的字符串中,并返回指向dest的指针。通俗的讲就是将 src字符数组复制到dest数组中,如果dest数组本身有数据,会把src里的数据全部复制到dest中,如果dest中有数据小于src地址长度的将会被覆盖,而大于src长度的将保留
说明:dest的地址长度要足够大,不然会产生溢出。Dest的内存长度要大于等于src的内存长度。
例子1.利用字符数组
输出结果是abcdef;
4.3 strcmp函数:是string compare的缩写,即字符串比较。
比较两个字符串。设这两个字符串为str1,str2,若str1=str2,则返回零;若str1>str2,则返回正数;若str1<str2,则返回负数。
原型:extern int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
说明:
当s1<s2时,返回为负数
当s1=s2时,返回值= 0
当s1>s2时,返回正数
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B" "a">"A" "computer">"compare"
特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
4.4 strlen函数:是string length的缩写,即字符串长度。
功能:计算字符串s的(unsigned int型)长度
说明:返回s的长度,不包括结束符NULL。
举例:
简单的总结一下:
以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。
其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以
调用其他的库函数的,这里只是给大家一个方法,不用变量就可以实现strlen。
1.数组在内存中的分布
我们来分析为什么a[0]=3?在C++中我们知道数组b中的最大下标角为9,当我们赋值给b[10]时,即使在数组b中下标10已经越界,但是
编译器还是会留存四个字节的地址给b[10]存放数值3,而a[0]的数组的存放地址恰恰是b[10]的存放地址,这也是a[0]为什么是3的原因了。
那我们怎么解决这一问题了?C++不同于java,如在java中这么写程序必然会报错,这是因为超出边界的数组无法通过编译。要在C++中
避免这种尴尬的局面,只好由程序员谨慎的规范。
2.数组名与函数
我们知道数组在定义的时候系统会自动创建一个指向该数组的指针,并且该指针自动指向该数组的第一个元素。
从上面我们可以看到,在main函数中我们其实操作的就是x[2]中的内存地址中的值。
3.枚举常量
定义:把变量的值一一列举,变量的值只能取其中的一个。
形式1:
[cpp] view
plain copy
enum city{上海,北京,南京,广州};//city为枚举类型名
city city1,city2;//city1,city2为city枚举类型的变量
形式2:
[cpp] view
plain copy
enum city{上海,北京,南京,广州}city1,city2;
例子:
[cpp] view
plain copy
#include <iostream>
using namespace std;
enum city {beijing, shanghai, shandong, guangzhou=7, tianjin};
void fn(enum city c)
{
switch(c)
{
case 0:cout << "beijing\n" << endl;break;
case 1:cout << "shanghai\n" << endl;break;
case 2:cout << "shandong\n" << endl;break;
case 7:cout << "guangzhou\n" << endl;break;
case 8:cout << "tianjin\n" << endl;break;
default :cout << "非法城市!\n" << endl;break;
}
}
int main()
{
enum city c1, c2, c3, c4;
c1 = (enum city)2;
c2 = shandong;
c3 = beijing;
c4 = (enum city)4;
fn(c1);
fn(c2);
fn(c3);
fn(c4);
cout << c1 << " " << c2 << " " << c3 << " " << c4;
return 0;
}
枚举常量的使用说明:
1.先定义枚举类型,在定义枚举常量,然后使用枚举常量;
2.枚举元素是常量,不是变量,所以不能对枚举元素进行赋值;
3.枚举元素是常量,其常量值不是列举的“内容”,而是定义时的次序号:0,1,......,n;
4.枚举元素值在定义时可以人为指定;
5.枚举变量的值只能取定义枚举类型时所列举的元素之一;
6.尽管枚举元素有值,但是此值并不是整型值,所以不能把整型数赋值给枚举变量;
7.枚举元素不是字符串,可进行逻辑判断比较运算。
4.strcat等系列函数表达的意义
4.1 strcat函数:是string catenate的缩写,即字符串连接。
字符串连接之后数值保存在第一个数组中,第二个保持不变。
我们需要注意的是:
1.第一个数组的字符长度要比第二个大,不然会报错误。
2.每个字符串结尾处都有一个结束标志“\0”。当通过strcat函数连接起来的时候,连接的字符串结尾处也有一个
结束标志“\0”,它是第2个字符串的,而第1个字符串的结束标志则自动取消。
4.2 strcpy函数:是string copy的缩写,即字符串复制。
从src地址开始且含有null结束符的字符串复制到以dest地址开始的字符串中,并返回指向dest的指针。通俗的讲就是将 src字符数组复制到dest数组中,如果dest数组本身有数据,会把src里的数据全部复制到dest中,如果dest中有数据小于src地址长度的将会被覆盖,而大于src长度的将保留
说明:dest的地址长度要足够大,不然会产生溢出。Dest的内存长度要大于等于src的内存长度。
例子1.利用字符数组
#include<iostream> Using namespace td; #include<string.h> Int mian(int argc, _TCHAR* argv[]) { Char str1[8]; Char str2[6]=”abcdef”; Strcpy(str1,str2);//将str2里面的字符串复制到str1数组中 Cout<<str1<<endl }
输出结果是abcdef;
4.3 strcmp函数:是string compare的缩写,即字符串比较。
比较两个字符串。设这两个字符串为str1,str2,若str1=str2,则返回零;若str1>str2,则返回正数;若str1<str2,则返回负数。
原型:extern int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
说明:
当s1<s2时,返回为负数
当s1=s2时,返回值= 0
当s1>s2时,返回正数
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B" "a">"A" "computer">"compare"
特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
4.4 strlen函数:是string length的缩写,即字符串长度。
功能:计算字符串s的(unsigned int型)长度
说明:返回s的长度,不包括结束符NULL。
举例:
// strlen.c #include <syslib.h> #include <string.h> main() { char *s="Golden Global View"; clrscr(); printf("%s has %d chars",s,strlen(s)); getchar(); return 0; } 下面给大家提供几种实现strlen函数的源代码,供大家参考: -------------------------------------------------1:start------------------------------------ #include <stdio.h> #include <assert.h> typedef unsigned int u_int; u_int Mystrlen(const char *str) { u_int i; assert(str != NULL); for (i = 0; str != '/0'; i++); return i; } ------------------------------------------------1:end-------------------------------------- -------------------------------------------------2:start-------------------------------------- int strlen(const char *str) { assert(str != NULL); int len = 0; while((*str++) != '/0') len++; return len; } ------------------------------------------------2:end ------------------------------------------ ------------------------------------------------3:start------------------------------------------ int strlen(const char *str) { assert(str); const char *p = str; while(*p++!=NULL); return p - str - 1; } -------------------------------------------------4:end----------------------------------------- -------------------------------------------------5:start---------------------------------------- int strlen(const char *str) { assert(str); const char *p = str; while(*p++); return p - str - 1; } -----------------------------------------------6:end----------------------------------------
简单的总结一下:
以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。
其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以
调用其他的库函数的,这里只是给大家一个方法,不用变量就可以实现strlen。
相关文章推荐
- 第六章:常量、宏、枚举及函数 第七章:数组、字符串
- c语言中函数(linux命令查看依赖类库),数组(内存存储是连续的内存空间),Linux下查看&a,&a[0],a之间的值,可变数组
- UVa401-Palindromes-回文词-字符函数,常量数组
- 堆与栈的解析-以数组为例,解析数组在内存中的分布(JAVA基础-课堂笔记)
- 静态数组和动态数组 内存分布
- swift中使用宏定义(使用let常量,或enum枚举,或函数)
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
- 4-14-多维数组、枚举、随机数、函数副本机制
- Jim's游戏外挂学习笔记4——查找怪数据数组的内存分布和地址
- C#初级篇---类型转换、枚举、结构体、数组、函数、
- 指针数组与数组指针 指针函数与函数指针,内存动态分配
- 【转载】查找怪数据数组的内存分布和地址(天龙八部)
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 从内存角度分析:数组删除自己内部指定对象和通过函数形参改值问题
- 指针常量/常量指针 数组指针/指针数组 函数指针/指针函数 返回函数指针的函数/返回数组指针的函数
- 学习心得——数组作为函数参数后sizeof获取不到数组在内存中所占字节数的问题
- 黑马程序员——C语言(函数、数组、字符串、进制、内存分析)总结
- string常量及字符数组的长度函数、赋值、拼接、附加
- 跳出循环、常量、枚举、数组、冒泡排序
- C++ 指针,常量,数组,函数,模板,内联等混淆概念