C语言之数组、字符串

数组

一、数组的定义和赋值

int ages[5] = {19, 29, 28, 27, 26};  //每个元素占4个字节,整个数组的大小为4*元素个数5
int ages[] = {19, 29, 28, 27, 26};  //定义数组可以不声明长度,后边大括号里的元素个数决定数组的长度
int ages[‘A’] = {19, 29, 28, 27, 26}  //’A’ == 65,所以这个数组的长度为65
ages[0] = 29;  //为某一个元素赋值或替换

二、数组的遍历

printf(“%d\n”, ages[0]);  //取出某一个元素

for(int i=0; i<5; i++)
{
    printf(“ages[%d]=%d\n”, i, ages[i]);  //逐个元素遍历
}

三、计算数组的长度

int count = sizeof(ages)/sizeof(int);

Eg:
for(int i=0; i<count; i++)
{
    printf(“ages[%d]=%d\n”, i, ages[i]);
}

四、数组的内存细节

char cs[5] = {‘a’, ‘A’, ‘D’, ‘e’, ‘f’};

char数组内存如下:


1、数组的地址就是首个元素的地址

for(int =0; i<5; i++)
{
    printf(“cs[%d]的地址是:%p\n”, i, &cs[i]);
}

2、数组的名就是数组的地址

printf(“%p\n”, cs);
int ages[3] = {10, 19, 18};
printf(“%p\n”, ages);
for(int i=0; i<3; i++)
{
    printf(“ages[%d]的地址是:%p\n”, i, &ages[i]);
}

Int数组内存如下:


五、数组作为形参

void method(int array[])  //数组作为形参无需声明数组长度
{
    array[0] = 100;
}

int main()
{
    int arr[] = {10, 20, 30, 40, 50};
    method(arr);  //数组名字作为实参传进函数时,相当于把数组的指针传入函数中,所以形参的地址和实参的地址是一个地址,所以改变同一块内存
}

六、二维数组

int ages2[3][5] = {
    {10, 20, 30, 40, 50},
    {10, 20, 30, 40, 50},
    {10, 20, 30, 40, 50}
};
int ages2[2][1];   //访问第三个数组中第二个元素,即20

字符串

一、C语言是使用字符类型数组来实现字符串的

char name[10] = “jack”;  
//等同char name[] = “jack”;
//等同char name[10] = {‘j’, ‘a’,‘c’, ‘k’, ‘\0’};
//或char name[10] = {‘j’, ‘a’,‘c’, ‘k’, 0};
//name数组长度为10,实际占了5个字节,分别为j、a、c、k、\0,\0的ASCII	//码为0,可以使用ASCII码值代替字符
printf(name);  
//printf默认只接收常量字符串,放变量编译会警告,但可以通过
char name2[] = {‘i’, ‘t’};  //不能当作字符串来用,因为没有结束符号\0,所以这只是一个字符类型数组

二、输出字符串

int main()
{
    char name[] = “itcast”;
    printf(“我在%s上课\n”, name);
}

三、修改字符串中的某一位字符

char name[] = “itcast”;  //等同char name[] = {‘i’, ‘t’, ‘c’, ‘a’, ‘s’, ‘t’, ‘\0’};
name[3] = ‘H’;

四、\0的作用

\0是字符串结尾的标示符

int main()
{
    char name[] = “it”;  //字符串
    char name2[] = {‘o’, ‘k’};  //这仅仅是一个字符数组,因为没有结束符号”\0”或0
    printf(“%s\n”, name);  //输出的是it  (name作为字符串传给函数printf)
    printf(“%s\n”, name2);  //输出的是okit   (name2作为数组指针传给printf函数,printf函数中规定输出字符串,遇到”\0”结束输出)原因见下图,内存示意
}


如上图内存示意图可知,从地址ffc4开始输出,一直到ffc8结束

如果name字符串中含有字符”\0”,比如name”itc\0ast”,那么printf(“%s\n”, name2);会输出okitc,遇到第一个”\0”结束输出。


五、strlen函数

包含于头文件#include <string.h>中

strlen 区别于 sizeof,因为strlen不计算\0,而sizeof计算\0

strlen计算的是不带\0的字符数,sizeof计算的是带\0的字节数

#include <string.h>
#include <stdio.h>

int main()
{
    int size = strlen(“haha”);
    printf(“%d\n”, size);   //输出为4
    return 0;
}

int main()
{
    char name[] = “itca\0st”;
    int size = strlen(name);
    printf(“%d\n”, size);
<pre name="code" class="csharp"><span style="font-family: 宋体;">    return 0;</span>
}
 上面的代码输出的是4,所以可以看出strlen()函数的原理是从数组name的地址开始计算到\0结束的长度 

六、输出字符串中某一个字符

int main()
{
    char name[] = "itcast";
    printf("%c\n", name[4]);  //输出为s,字符串就是一个字符数组,最后一位为”\0”
}

七、字符串数组

#include <string.h>
#include <stdio.h>

/*
 字符串数组即字符型二维数组
 */
int main()
{
    char name1[] = "jack";
    char name2[] = "rose";
    
    char names[2][10] = {"jack", "rose"};  //等同于下边的写法
    /*
    char names[2][10] = 
    {
        {'j', 'a', 'c', 'k', '\0'},
        {'r', 'o', 's', 'e', '\0'}
    }
    */
    printf("%s\n", names[1]);  //输出第二个字符串
    
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值