标签:
------- ios培训、 android培训、java培训、期待与您交流! ----------
一.系统内存分区
总结:
栈:存放局部变量(函数中定义的变量),内存由系统管理
堆:存放对象,它由程序猿自己申请自己释放,内存需要程序猿自己管理
全局区:存放全局变量与静态变量,由系统管理
常量区:用来存放常量,内存由系统管理,它是只读区
代码区:存放代码的,内存由系统管理,它是只读区
二.定义字符串
1.定义字符串的第一种方式:使用字符数组
char name[] = "sxl";
name[1] = ‘y‘;// 此处可以修改字符串
2.使用char类型指针
char *name1 = "ly";
*name1 = ‘s‘;// 此处是错误的,因为这个指针指向常量区的字符串,所以不能修改其所指向的字符串
总结:字符数组在栈中存储,栈是可读可写的区域,字符的内容可以随意修改;
使用char类型指针定义的字符串,存储在常量区,它所指向内容不可以修改
使用场景:
当定义的字符串内容需要修改就是用字符数组定义
当定义的字符串不需要修改就是用字符指针定义
好处:1.常量区的东西无论使用多少次,在内存中只有一份
2.效率高,省内存
3.内容不可以修改,可以保证程序的安全
三.const关键字
const 修饰变量 说明定义的变量是只读的,格式: const 数据类型 变量名称
const 修饰数组 表示数组是只读的,必须定义的时候进行初始化
const 修饰指针 如果const放在*前面,表示指针指向的内容是只读的,如果放在*后面,表示指针本身是只读的,不能改变指向
const 修饰形参 保证这个形参不会被函数修改,同时也可以告诉函数的调用者,本函数不会修改它里面的内容,可以提高函数可读性
四.字符串数组
1.第一种定义方式:使用char类型的二维数组
这里的字符串的字符元素放在栈中,是可以修改的
char names[][20] = {
"cl"
"llj"
"zzd"
"cwz"
"hjb"
"lxl"
};
2.第二种定义方式:字符指针数组
数组中的字符串元素是不可以修改的
char *names1[]={
"cl"
"llj"
"zzd"
"cwz"
"hjb"
"lxl"
};
五:动态存储空间的使用
堆:动态存储区:它的内存由程序员管理
1.导入stdlib.h
malloc(size_t size);
向操作系统申请堆中一块存储空间,如果操作系统分配成功,就会返回这个存储空间的地址,否则返回NULL
2.free(void *)告诉系统这块存储空间不再使用了
注意点: 有1个malloc就有1个free与之对应,否则会造成内存泄露
释放过的指针不可以再次释放,否则程序会崩溃
#include <stdio.h> int main(int argc ,const char *argv[]{ int *pi = malloc(sizeof(int)); if(pi!=NULL){ // 使用内存 *pi = 20; //释放内存 free(pi); printf("%d\n",*pi); //清空指针 pi = NULL; return 0; }
六.自己的理解
1.字符串和字符数组的区别
(1)字符串有一个结尾标识\0,而字符数组以任意字符结尾,字符串根据\0来判断长度
(2)%s输出内容会检查是否遇到\0
(3)字符数组部分初始化,没有显式初始化的元素会被初始化为0
(4)当初始化一个字符数组的时候,如果没有把空间填满,那么这个字符数组就是字符串
2.接收用户录入字符串的三种方式
scanf: 不能接受带有空格的字符串,因为%s遇到空格就结束了
gets(): 可以读取空格,但不会检查数组长度,有可能导致数组越界
fgets(name,sizeof(name),stdin): 可以读取空格,会检查数组长度,比较安全
七.字符串常用函数:
1.用来计算字符串长度的函数(不包含\0)
size_t strlen(const char *str);
2.拷贝字符串函数
strcpy(char * dest,const char * src);
ps:如果src长度超过dest所能容纳的长度可能导致程序崩溃
strncpy(char * dest,const char * src,size_len);
ps:使用strncpy拷贝比较安全,因为len表示要拷贝的字符长度(不包含\0)
3.字符串拼接函数
strcat(char * dest,const char * src);
把src中内容拼接在dest原有字符串后面,从前往后找,找到第一个\0位置开始拼接
4.字符串比较函数
strcmp(const char * src1,const char * src2);
str1与str2从第一个字符开始比较,若相等就比较后面的字符。结果都相等就返回0,遇到不相等字符就返回这2个字符ASCII值的差
八.练习:从键盘上输入一大堆字符串,统计A,B,C,D出现次数,并按出现次数从大到小的顺序打印字母和出现次数
1 #include <stdio.h> 2 3 #include <string.h> 4 5 int main(int argc ,const char *argv[]{ 6 7 //定义一个字符串并提示用户输入字符串 8 9 char str[100]; 10 11 printf("请随机输入字符串,英文字母不分大小写\n"); 12 13 //接收用户的录入 14 15 fgets(str,sizeof(str),stdin); 16 17 // 计算字符串长度 18 19 size_t strlen(str); 20 21 //定义变量记录ABCD出现次数 22 23 int countA,countB,countC,countD; 24 25 countA=countB=countC=countD=0; 26 27 // 遍历字符串 28 29 for(int i=0;i<strlen;i++){ 30 31 //统计出现次数 32 33 if(srt[i]=‘A‘){ 34 35 countA++; 36 37 } 38 39 if(srt[i]=‘B‘){ 40 41 countB++; 42 43 } 44 45 if(srt[i]=‘C‘){ 46 47 countC++; 48 49 } 50 51 if(srt[i]=‘D‘){ 52 53 countD++; 54 55 } 56 57 } 58 59 printf("A出现%d次 B出现%d次 C出现%d次 D出现%d次\n",countA,countB,countC,countD); 60 61 // 整型数组nums存放ABCD出现次数,字符数组letter存放ABCD 62 63 int nums[4]={countA,countB,countC,countD}; 64 65 char letter[4]="ABCD"; 66 67 //利用冒泡排序,降序排列 68 69 length = 4; 70 71 for(int i=0;i<length-1;i++){ 72 73 for(int j=0;j<length-1-i;j++){ 74 75 if(nums[j]<nums[j+1]){ 76 77 int temp; 78 79 temp = nums[j]; 80 81 nums[j]=nums[j+1]; 82 83 nums[j+1]=temp; 84 85 char tempC; 86 87 tempC = letter[j]; 88 89 letter[j] = letter[j+1]; 90 91 letter[j+1] = tempC; 92 93 } 94 95 } 96 97 } 98 99 //打印结果 100 101 for(int i=0;i<4;i++){ 102 103 printf("%c:%d\n",letter[i],nums[i]); 104 105 } 106 107 return 0; 108 109 }
标签:
原文地址:http://www.cnblogs.com/ly0709/p/5042986.html