学习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;
}
使用
strncpy
比strcpy
多出一个参数,第三个参数,是表示复制的字符串数字个数。
- 连接字符串: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语言第六天的主要内容,如果未能解决你的问题,请参考以下文章