1、字符数组的数组名存的就是字符数组的起始地址,类型是字符指针
2、str系列字符串函数主要包括strlen,strcpy,strcmp,strcat
strlen:用于统计字符串长度
strcpy:用于将某个字符串复制到字符数组中
strcmp:用于比较两个字符串的大小,比较对应字符的ASCII码值
strcat:用于将两个字符串连接到一起,并赋值给前一个字符串
1 #include <string.h> 2 size_t strlen(char *str); 3 char *strcpy(char *to,const char *from); 4 int strcmp(const char *str1,const char *str2);//-1,0,1 5 char *strcat(char *str1,const char *str2);
3、指针的本质:将变量i的地址存放到另一个变量中,指针变量就是一种特殊的变量,它用来存放变量地址
4、fgets(c,sizeof(c),stdin)与gets(c)一样
5、指针适用于传递和偏移
传递:间接访问变量的值,大多在函数中使用,函数调用本质是值传递
偏移:对指针的加减就是指针的偏移,加就是向后偏移,减是向前偏移
数组是特殊的,不能和整型变量,浮点型,字符型变量类比,a的类型为数组,它是数组名,a里存了一个值,是地址值,是数组的起始地址
(内存分为3种权限:可读、可写、不可读)
5、指针加一,是指向下一个地址
6、*p++,先做*p,然后p++
7、指针与一维数组:
数组名作为实参传递给子函数时,是弱化为指针的
8:指针与动态内存申请:
数组长度固定是因为其定义的整型、浮点型、字符型变量、数组变量都在栈空间中,而栈空间的大小在编译时是确定的。
如果使用的空间大小不确定,那么就要使用堆空间。
程序时放在磁盘上的有序的指令集合,程序启动起来时才叫进程
栈空间是自动分配跟收回的,而堆空间需要自己申请,并且手动释放,如:p=(char*)malloc(20); free(p);栈空间比较高
malloc(),用于动态申请堆空间,它申请的空间的单位是字节,其为void*,无类型指针,它只能用来存储一个地址而不能进行偏移,所以我们在使用它时,需要强制转换为对应的类型,如:char *p; p=(char*)malloc(20);
并且malloc申请的空间会返回一个堆空间的首地址,我们可以把首地址存入变量P
free(p):free时必须使用malloc申请时返回的指针值,不能进行任何偏移
free(p)之后,要把p变成NULL,或者或变成野指针
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main() 6 { 7 int i; 8 char *p; 9 scanf("%d",&i); 10 p=(char*)malloc(i);//使用malloc动态申请堆空间 11 strcpy(p,"malloc success"); 12 puts(p); 13 free(p);//释放空间,p的值必须和malloc返回的值一致 14 p=NULL;//如果不置为NULL,否者为野指针 15 printf("free success\n"); 16 //system("pause"); 17 18 19 return 0; 20 }
9、栈空间与堆空间的差异:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //栈空间 6 char* print_stack() 7 { 8 char c[]="I am print_stack"; 9 puts(c); 10 return c; 11 } 12 13 //堆空间 14 char* print_malloc() 15 { 16 char *p; 17 p=(char*)malloc(20); 18 strcpy(p,"I am print_malloc"); 19 puts(p); 20 return p; 21 } 22 23 int main() 24 { 25 char* p; 26 p=print_stack(); 27 puts(p);//栈空间会随着函数的执行结束而释放,此时puts(p)不能正确输出 28 p=print_malloc();//申请的堆空间只有在free(p)之后,才会随着函数的结束而释放,或者进程结束,否则不影响 29 puts(p); 30 return 0; 31 }
10、字符指针与字符数组的初始化:
字符指针是不可以对常量区数据进行修改,如:
char* p="hello";//把字符串常量"hello"的首地址赋给p
p[0]='H';此时p[0]是错误的,它不能进行修改
p="world";//将字符串world的地址赋给p
char c[10]="hello";//定义数组时,C的地址已确定
c="world";//非法,简单说c可以被当作一个常量对待,不可改
11、函数与结构体:
为什么strcpy,没有头文件也可以运行,原因是这个函数的实现是在C库中,头文件中只是声明
标签:字符,malloc,char,数组,空间,指针 From: https://www.cnblogs.com/TiAmo-bai/p/17279482.html