C语言基础 字符数组 字符串操作函数 指针 4.4

文章详细介绍了C语言中的循环结构,包括for循环和goto语句的使用。接着讨论了数组的声明、初始化和赋值,特别提到了一维数组和二维数组的差异。对于字符串,文章讲解了字符数组、字符串结束符以及相关的字符串操作函数如strlen、strcpy等。最后,文章涉及了指针的概念、初始化、使用以及指针与数组的关系。
摘要由CSDN通过智能技术生成

4.4

复习

循环结构:

for 一般形式:
for(表达式1;表达式2;表达式3)
先执行表达式1,再执行表达式2,然后进入循环体,最终执行表达式3.回来之后判断表达式2是否满足,再执行循环,然后表达式3.
    
    goto
    例子:
 A:语句块;
    语句块;
    语句块;
    语句块;
    goto A;
    一般用在底层、破坏程序结构、影响程序可读性……
    
    数组:存储类型,数据类型,数组名[元素个数]:
    存储类型:默认不写auto
    数据类型:和元素的数据类型一致
    数组名:是标识符
      数组名是数组的首地址
    []:数组运算符
    元素个数:数组能存储的最大个数
    赋值:
    数组名[下标]:
    小标从0开始;下标最大为:n-1
    例:
    int a[10];
     a[0]=1;
    a[1]=a[0];
初始化:
    定义的时候同时赋值
    完全初始化:
    int a[6]={2,3,4,5,6,7};
未完全初始化:
    int a[10]={3,4,5,6};//未赋值的部分全为0
int a[10]={0};//所有元素全为0
int a[]={4,2,5,6}//数组空间的大小有几个元素就开辟多少个空间

二维数组:存储类型,数据类型,数组名[][];
    在C语言中内存存储行优先
    最大存储个数:行*列
    初始化:
      完全初始化:
    int a[2][3]={2,4,5,5,67,6};
    int a[2][3]={{2,4,5},{3,4,6}};
      未完全初始化:
          int a[2][3]={4,5,6};//未赋值的部分全为0
          int a[2][3]={{4,5},{7}};
		  int a[][3]={4,5,7,8}; //只能缺行不能缺列
赋值:
    数组名[行下标][列下标]int a[2][3]={3,5,6,7,8,9};
a[0][0]==3;
a[1][0]==7;

a==&a[0][0]==a[0];

today

字符数组

字符串:由一个或者多个字符组成,末尾由'\0'结尾
    字符数组:数据类型为字符型的数组
    例:
    char a[10]={'a','b','c'};
    char a[10]={"abc"};//
char a[10]="abc";
char a[5]="abcde"//错误的,末尾的'\0'没有位置存放
    赋值:
    char a[50];
gets(a);//获取一串字符串;
puts(a);//输出一串字符串;
scanf("%s",a)//数组名就是地址

字符串操作函数

strlen

功能: 计算字符串长度,遇到'\0'结束,不会计算'\0'
       sizeof() 只能计算数组有多大。
头文件:#include <string.h>
函数原型
    size_t strlen(const char *s);//数据类型修饰
    size_t :函数类型:unsigned long 的取别名
        const char*s :形式参数
        返回值: size_t 返回计算的字符串的长度
        #include <stdio.h>
  8 #include <string.h>
  9 int main(int argc, char *argv[])
 10 {
 11     char a[10]={"asffsd"};
 12     int i=strlen(a);
 13     printf("sizeof=%ld\n",sizeof(a));
 14     printf("len=%d\n",i);
 15     
 16     return 0;
 17 } 
  
hqyj@ubuntu:~/4.4$ ./a.out
sizeof=10
len=6
    
    size_t strnlen(const char*s,size_t maxlen);
计算最大长度为maxlen

strcat

功能:将两个字符串连接在一起
将src追加在dest末尾,连接两个字符串

头文件:#include <string.h>
函数原型:char *strcat(char *dest,const char *src);
函数参数:
		dest:目标字符串
		src:  源字符串
返回值:目标字符串的首地址

	char *strncat(char *dest,const char *src,size_t n);
	将src字符串的前n个字符追加在dest字符串

strcpy

功能:将src字符串复制到dest字符串
    头文件:#include <string.h>
函数原型:char *strcpy(char *dest,const char *src);
函数参数:
		dest:目标字符串
		src:  源字符串
返回值:目标字符串的首地址
	char *strncpy(char *dest,const char *src,size_t n);
	将src字符串前n个字符复制到dest字符串

strcmp

功能:通过ASCII码表比较两个字符串大小,返回差值
    头文件:#include <string.h>
函数原型:int strcmp(const char *s1,const char *s2);
函数参数:
		s1:目标字符串
		s2: 源字符串
返回值:从字符串第0位开始比较,遇到字符不同时相减,返回差值
	int strncmp(const char *s1,const char *s2,size_t n);
	比较前n位字符串

strstr

检索两个数组相同数第一次出现的位置,输出相同字符串后面的一系列
    头文件:#include <string.h>
函数原型:char *strstr(const char *s1,const char *s2);
函数参数:
		s1:目标字符串
		s2: 源字符串
返回值:返回源字符串在目标字符串第一次出现的位置

指针

指针就是地址,地址由多个内存单元组成,每一个内存单元由一个或者多个字节组成,每个字节都有自己的编号,这个编号叫做地址

指针的定义
定义:存储类型 数据类型  *指针变量名;
    存储类型:auto···
    数据类型:指向数据的数据类型
    *1.乘法
        2.抑制符
        3.定义的时候表示变量名是个指针变量名
    	4.取该地址下的内容
    &1.取地址
    	2.与运算
    指针变量名:存放地址的变量,通常称为指针
    指针的大小与操作系统有关,与所指的数据类型无关

例:
		int *p;  //定义一个指向int指针
		char *q; //定义一个指向char指针
指针的初始化
int a=2;
int *p=&a;
char b[10];
char *q=b;
/*int *p;*/野指针
    p:表示地址;
    *p:表示内容;
    sizeof(p);  //指针大小为8个字节,和操作系统有关
	sizeof(q);
指针的使用
int a=2;
int *p=&a;
*p=3; //通过指针p操作变量a的地址空间并赋值为3
间接访问
	a = 3;  //直接通过变量a赋值为3,直接访问
指针运算
指针和整数运算;
    int *p;
    int *q;
    p++ //偏移一个数据类型大小
    p+n; //指针偏移N个数据类型字节
int a[10]={23,6,78,5,8,3,79,56,89,1};
	int *p=a;
	printf("%d\n",*p);   //指向23,值为23
	printf("%d\n",*p+6); //指向23,23加6=29 输出29
	printf("%d\n",*(p+6));//运算时偏移6个数据为79,结束后指回23
	printf("%d\n",*p++); //先输出指向的23后偏移一个数据到6
	printf("%d\n",*++p); //先偏移一个数据再输出此时的指向78
	
	只有减法,表示两个指针之间的数据个数

练习:
    用指针链接两个字符串?
    
  9 int main(int argc, char *argv[])
 10 { 
 11     char a[20]="hello";
 12     char b[20]="nihao";
 13     char *p=a;
 14     char *q=b;
 15     while(*p!='\0')
 16     {
 17         p++;
 18     }
 19     while(*q!='\0')
 20     {
 21         *p=*q;
 22         p++;
 23         q++;
 24     }
 25     puts(a);
 26     return 0;
 27 } 
hqyj@ubuntu:~/4.4$ ./a.out [A
hellonihao

2.用指针实现符号逆序
    9 int main(int argc, char *argv[])
 10 {
 11     char a[10]="0",b[10]="0";
 12     gets(a);
 13     char *p=a;
 14     char *q=b;
 15     p+=strlen(a)-1;
 16     for(int i=0;i<strlen(a);i++)
 17     {
 18         b[i]=*p;
 19             p--;
 20     }
 21     puts(b);
 22     
 23     return 0;
 24 } 
hqyj@ubuntu:~/4.4$ ./a.out 
asdfg
gfdsa
特殊指针
野指针:
    只定义不指向内容
    int *p;
	char *q;
野指针没有明确指向空间,使用危险
    
空指针:
    指向0地址空间的指针
    例:
    int *p=NULL;
printf("%d\n",*p); //一定会报段错误
最大的作用:消除野指针。
空类型指针;
    指向类型为空类型
    例:
    viod *p=NULL;
使用时要强转:(int *)p;
	
指针和一维数组
int a[10]={23,6,78,5,8,3,79,56,89,1};
	int *p=a;
	printf("a[0]=%d\n",a[0]);       //23
	printf("p[0]=%d\n",p[0]);       //23
	printf("p[1]=%d\n",p[1]); 		//6
	printf("*(p+1)=%d\n",*(p+1));	//6
	printf("*(a+1)=%d\n",*(a+1));	//6
	printf("*(a+3)=%d\n",*(a+3));	//5
	printf("*(p+3)=%d\n",*(p+3));	//5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独memories

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值