字符数组指针巩固学习

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库中,头文件中只是声明

 

posted @ 2023-04-09 19:28  xxxbai  阅读(41)  评论(0)    收藏  举报