学习C语言第六天

Posted Lynchteacher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习C语言第六天相关的知识,希望对你有一定的参考价值。

一.多维数组元素的地址

#include<stdio.h>

int main()
    
    int arr[3][4] = 11,22,33,44,12,13,15,16,22,66,77,88;
    int i;
    int j;
    for(i=0;i<3;i++)
        for(j=0;j<4;j++)
            printf("add:0x%p,data:%d ",&arr[i][j],arr[i][j]);
            printf("add:0x%p,data:%d ",arr[i]+j,arr[i][j]);
        
    
    return 0;

二.二级指针

  认知考虑的时候,其实所有东西跟一级指针一样  写法 int **p

#include<stdio.h>

int main()
    
    int data = 100;
    int *p = &data;
    printf("data的地址是:%p\\n",&data);
    printf("p保存data的地址:%p,内容是%d\\n",p,*p);
    
    
    int **p2;
    p2 = &p;
    printf("p2保存p的地址: %p \\n",p2);
    printf("*p2是%p\\n",*p2);
    printf("**p2来访问data:%d\\n",**p2);
    
    return 0;


输出结果为:
data的地址是:000000000061FE14
p保存data的地址:000000000061FE14,内容是100
p2保存p的地址: 000000000061FE08
*p2是000000000061FE14
**p2来访问data:100

注意:二级指针不能简单粗暴指向二维数组

c 语言学习第六天

数组

语法: 类型 数组名[元素个数];

int a[6];  //  4*6 字节
char b[24]; // 1*24  字节
double c[2]; // 2*8  字节

访问数组中的元素

语法: 数组名[元素下标]

a[2];
b[4];
c[1];
  • 注意
int a[6];
a[0]; // 访问第一个元素
a[6]; // 访问第七个元素 出现数组越界。

使用循环给数组赋值

#include<stdio.h>
#define NUM 10

int main(){
	int a[NUM];
	int i,sum=0;

	for(i = 0;i < NUM;i++){
		printf("请输入第%i位同学的成绩:",i+1);
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	printf("成绩录入完毕,该次考试的平均分是:%.2f\\n",(double) sum/NUM);
	return 0;
}

初始化

语法: 类型 数组名[元素个数] = {n,n+1,....};

#include<stdio.h>
#define NUM 5

int main(){
	int a[NUM] = {0};
	int b[NUM] = {1,2,3,4,5};
	int i;
	for (i = 0;i < NUM;i++){
		printf("a的第%d个元素为:%d\\n",i+1,a[i]);
		printf("b的第%d个元素为:%d\\n",i+1,b[i]);
	}
	return 0;
}
a的第一个元素为:0
b的第一个元素为:1
a的第一个元素为:0
b的第一个元素为:2
a的第一个元素为:0
b的第一个元素为:3
a的第一个元素为:0
b的第一个元素为:4
a的第一个元素为:0
b的第一个元素为:5
#include<stdio.h>
#define NUM 5

int main(){
	int a[NUM];
	int b[NUM] = {1,2,3,4,5};
	int i;
	for (i = 0;i < NUM;i++){
		printf("a的第%d个元素为:%d\\n",i+1,a[i]);
    printf("b的第%d个元素为:%d\\n",i+1,b[i]);
	}
	return 0;
}
a的第一个元素为:0
b的第一个元素为:1
a的第一个元素为:0
b的第一个元素为:2
a的第一个元素为:26
b的第一个元素为:3
a的第一个元素为:0
b的第一个元素为:4
a的第一个元素为:0
b的第一个元素为:5
  • 有时候初始化了数组的值,可以在定义的时候不写数组的长度
#include<stdio.h>
#define NUM 5
int main(){

	int b[] = {1,2,3,4,5};
	int i;
	for (i = 0;i < NUM;i++){
		printf("b的第%d个元素为:%d\\n",i+1,b[i]);
	}
	return 0;
}
  • c99 新特性:指定初始化的元素。未被赋值的元素自动初始化 0;
#include<stdio.h>
#define NUM 5

int main(){

	int b[5] = {[3] = 4,[4] = 7};
	int i;
	for (i = 0;i < NUM;i++){
		printf("b的第%d个元素为:%d\\n",i+1,b[i]);
	}
	return 0;
}
b的第1个元素为:0
b的第2个元素为:0
b的第3个元素为:0
b的第4个元素为:4
b的第5个元素为:7
  • sizeof
#include<stdio.h>
#define NUM 5
int main(){

	int b[5] = {[3] = 4,[4] = 7};
	int i;
	for (i = 0;i < NUM;i++){
		printf("b的第%d个元素为:%d\\n",i+1,b[i]);
	}
	printf("sizeof b:%d个字节",sizeof(b));
	return 0;
}
b的第1个元素为:0
b的第2个元素为:0
b的第3个元素为:0
b的第4个元素为:4
b的第5个元素为:7
sizeof b:20个字节
  • c99 支持可变长度,是值用变量指定数组的长度
#include<stdio.h>

int main(){
	int n,i;
	printf("请输入字符串个数:");
	scanf("%d",&n);
	char a[n+1];

	printf("请输入字符串:");
	getchar(); // 把输入字符串个数之后的回车键获取扔掉
	for(i = 0;i < n; i++){
		scanf("%c",&a[i]);
	}
	a[n] = \'\\0\';
	printf("你输入的字符串是:%s\\n",a);
	return 0;
}

在录入数据的时候会出现换行,所以在 for 前加上getchar();

数组越界

#include<stdio.h>

int main(){
	int a[10],i;
	for(i = 0;i <= 10; i++){
		a[i]=i;
	}

	for(i = 0;i <= 10; i++){
		printf("%d\\n",a[i]);
	}

	return 0;
}
0
1
2
3
4
5
6
7
8
9
10

可以打印出 11 个元素,越界不报错的原因是编译器做了手脚。不是所有的编译器可以正常执行。

字符数组

定义方式

  • 初始化字符串数组每个元素,以\\0结尾
char str[6] ={ \'H\',\'e\',\'l\',\'l\',\'o\',\'\\0 \'};
  • 可以不写元素的个数,因为编译器会自动计算
char str[] = { \'H\',\'e\',\'l\',\'l\',\'o\',\'\\0 \' };
  • 使用字符串常量初始化字符串数组
char str[] = {"Hello"};
  • 使用字符串常量初始化,可以忽略大括号
char str[]= "Hello";

字符串处理函数

  • 获取字符串长度(个数):strlen
#include<stdio.h>
#include<string.h>
int main(){
	char str[] = "hello";
	printf("sizeof str = %d\\n",sizeof(str)); // sizeof str = 6
	printf("strlen str = %u\\n",strlen(str)); // strlen str = 5
	return 0;
}
  • 拷贝字符串:strcpy,strncpy
#include<stdio.h>
#include<string.h>
int main(){

	char str1[] = "hello world";
	char str2[] = "New string 123";
	char str3[100];
	strcpy(str2,str1);
	strcpy(str1,"123");
	strcpy(str3,"321");
	printf("str1 = %-20s , size = %4d\\n",str1,sizeof(str1));
	printf("str2 = %-20s , size = %4d\\n",str2,sizeof(str2));
	printf("str3 = %-20s , size = %4d\\n",str3,sizeof(str3));
	// str1 = 123                  , size =   12
	// str2 = hello world          , size =   15
	// str3 = 321                  , size =  100
	return 0;
}

使用 strcpy 第一个参数的字符串内存一定要大于第二个,否则会出现字符串截断。

#include<stdio.h>
#include<string.h>
int main(){
	char str1[] = "to be No.1";
	char str2[50];
	strncpy(str2,str1,4);
	str2[4] = "\\0";
	printf("str2 = %s\\n",str2); // str2 = to b
	return 0;
}

使用 strncpystrcpy多出一个参数,第三个参数,是表示复制的字符串数字个数。

  • 连接字符串:strcat,strncat
#include<stdio.h>
#include<string.h>
int main(){

	char str1[] = "hello";
	char str2[] = " world!";
	strcat(str1," big");
	strcat(str1,str2);
	printf("str1: %s",str1); // str1: hello big world!
	return 0;
}
#include<stdio.h>
#include<string.h>
int main(){

	char str1[] = "hello";
	char str2[] = "world!";
	strncat(str1," big",1);
	strcat(str1,str2);
	printf("str1: %s",str1);  // str1: hello world!
	return 0;
}
  • 比较字符串:strcmp,strncmp
#include<stdio.h>
#include<string.h>
int main(){

 	char str1[] = "hellbe No.1";
	char str2[] = "hello wold";
	int num = 3;
	int b = strcmp(str1,str2);
	int c = strncmp(str1,str2,num);
	printf("b = %d\\n",b);
	printf("c = %d\\n",c);
	if(!c){
		printf("两个字符串前%d完全一致!\\n",num);
	}else{
		printf("两个字符串前%d存在差异!\\n",num);
	}
	if(!b){
		printf("两个字符串完全一致!\\n");
	}else{
		printf("两个字符串存在差异!\\n");
	}
	// b = -1
	// c = 0
	// 两个字符串前3完全一致!
	// 两个字符串存在差异!
	return 0;
}

strcmp方法 相同返回0,不同返回其余数字。

以上是关于学习C语言第六天的主要内容,如果未能解决你的问题,请参考以下文章

第六天

C语言第六天:结构体变量与链表1

C语言第六天笔记2016年01月19日(周二)A.M

黑马程序员C语言基础(第六天)指针

python语法学习第六天--集合

2018-11-21 python学习第六天