首页 > 其他分享 >字符数组指针巩固学习

字符数组指针巩固学习

时间:2023-04-09 19:47:52浏览次数:43  
标签:字符 malloc char 数组 空间 指针

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

相关文章

  • Rust 的 parse() 是一个用于将字符串解析为其他类型的方法
    在Rust中,parse()是一个用于将字符串解析为其他类型的方法。例如,可以将字符串解析为整数、浮点数或布尔值等。在这个例子中,parse()方法被用来将用户从标准输入中读取的字符串(即变量input_num)解析为整数类型。需要注意的是,parse()方法返回一个Result枚举类型,因为解析字符串......
  • 23:二维数组回形遍历
    描述给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示:输入输入的第一行上有两个整数,依次为row和col。余下有row行,每行包含col个整数,构成一个二维整数数组。(注:输入的row和col保证0<row<100,0<col<100)输......
  • python 提取字符中的数字
      一、isdigit()函数isdigit()函数是检测输入字符串是否只由数字组成。如果字符串只包含数字则返回True否则返回False。1234567891011dream="123456"print(dream.isdigit())#返回:True dream="123abc456"print(dream.isdigit())#返回:Fa......
  • C++数组
    数组C++中的数组是一种特殊类型的变量,它可以存储一组具有相同数据类型的元素,这些元素在内存中是按照一定的顺序排列的。下面是C++数组的一些特点:数组的元素类型必须相同。例如,一个int类型的数组中只能存储int类型的元素。数组的大小是固定的。一旦数组被创建,它的大小就不能再......
  • 提取字符
    问题:提取汉字“线”和符号“_”之间的数字,及汉字“线”之前的字母(如果有) 函数公式解决:=MID(A1,FIND("线",A1)+1,FIND("_",A1)-FIND("线",A1)-1)&MIDB(A1,SEARCHB("?线",A1&"1线"),1)FIND("线",A1)找“线”在A1中的位置;FIND("_",A1)找“_”......
  • [省选联考 2023] 染色数组 题解
    题目描述给定一个长度为\(n\)的正整数数组\(A\),其中每个数都在\(1\)到\(m\)之间,从左到右排成一排。现在要将每个数字染成红色或者绿色,我们定义一个染色方案为优秀的染色方案,当且仅当它满足:每个数\(A_{i}\)要么被染成红色,要么被染成绿色。红色的数从左到右依次严格递......
  • [省选联考 2023] 染色数组 题解
    题目描述给定一个长度为\(n\)的正整数数组\(A\),其中每个数都在\(1\)到\(m\)之间,从左到右排成一排。现在要将每个数字染成红色或者绿色,我们定义一个染色方案为优秀的染色方案,当且仅当它满足:每个数\(A_{i}\)要么被染成红色,要么被染成绿色。红色的数从左到右依次严格递......
  • 数组的算法
    数值型数组特征值统计这里特征值涉及到:平均值,最大值,最小值,总和等求最大值:将数组第一个元素假设为最大值intmax=arr[0];再然后用写一个判断语句如果数组第一个元素小于当前比较的元素就把当前比较的元素赋值给maxif(max<arr[i]){max=arr[i]}求最小值:定义一个变量这个数大......
  • 求字符串长度的三种方法
    1.指针#include<stdio.h>intstrlen(chars[]){intlen=0; while(*s++!='\0') {len++; } returnlen;}intmain(){ chars[]="123456789"; printf("%d\n",strlen(s)); system("pause&q......
  • 16进制字符串转byte
    1publicclassHexConverUtils{23/**4*16进制字符集5*/6privatestaticfinalcharHEX_DIGITS[]={'0','1','2','3','4','5',7'6','7&#......