我是靠谱客的博主 愤怒大米,最近开发中收集的这篇文章主要介绍c语言 数组和字符串,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数组和字符串

string.h 包含 memcpy、memset

从int数组a复制k个元素到int数组b:memcpy(b,a,sizeof(int)*k)

把数组a全部复制到数组b中:memcpy(b,a,sizeof(a))

把数组a清零:memset(a,0,sizeof(a))

字符串:

char s[] = "aasdsa123"; or char *s = "asdasdasd123";

字符数组:

char s[7] = {'0','1','2','a'}; (7可以省略)
数组

const char rev[] = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char msg[4][30]= {"not a palindrome",//不是回文词
    "a regular pelindrome",//是回文词
    "a mirrored string",//镜像串
    "a mirrored palindrome"};//回文镜像串

指针

const char* rev = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char* msg[] = {"not a palindrome",//不是回文词
    "a regular pelindrome",//是回文词
    "a mirrored string",//镜像串
    "a mirrored palindrome"};//回文镜像串
const char *s = {"A   3  HIL JM O   2TUVWXY51SE 2  8 "};
printf("%d",sizeof(s));
输出结果:8

const char s[] = {"A   3  HIL JM O   2TUVWXY51SE 2  8 "};
printf("%d",sizeof(s));
printf("%d",strlen(s));
printf("%c",s[33]);
printf("%d",s[33]);
输出结果:36
        35
        8
        56
  1. %c只能输出或输入一个字符,%s输出的是一串字符。此外,char a; string s;输入的时候scanf(“%c”, &a);这里的&不能少,而scanf(“%s”,s);这里不能有&符号

  2. char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:当char *s = "hello";后,不能使用s[0]='a';当用char s[]=”hello”;后,完全可以使用s[0]=’a’;进行赋值,这是常规的数组操作。

  3. C语言中定义一个变量时可以初始化。char str[10] = {“hello world”};
    当编译器遇到这句时,会把str数组中从第一个元素把hello world 逐个填入

  4. C语言中规定数组代表数组所在内存位置的首地址,也是 str[0]的地址,即str = &str[0]

  5. 在C语言中字符串常量的本质表示其实是一个地址(第一个字符的地址)举例: char *s ;
    s = “China”;
    为什么可以把一个字符串赋给一个指针变量,这不是类型不一致吗???
    C语言中编译器会给字符串常量分配地址,如果 “China”, 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005。s = “China” ,意识是什么,对了,地址。其实真正的意义是 s ="China" = 0x3000;
    看清楚了吧 ,你把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质表现是代表它的第一个字符的地址。s = 0x3000 这样写似乎更符合直观的意思。而printf("%s",str),原理是通过字符串首地址输出字符串。

char * 与 char a[ ]

  1. 前面说到a代表字符串的首地址,而s这个指针也保存字符串的地址(其实首地址),即第一个字符的地址,这个地址单元中的数据是一个字符,这也与 s 所指向的 char 一致。
    因此可以 s = a;但是不能 a = s;C语言中数组名可以复制给指针表示地址,但是却不能赋给给数组名,它是一个常量类型,所以不能修改。
  2. 字符指针可以用间接操作符 *取其内容,也可以用数组的下标形式 [ ],数组名也可以用 *操作,因为它本身表示一个地址 。比如 char a [ ] = “hello”; printf(“%c”,*a); 将会打印出 ‘h’。

char * 与 char a[ ] 的本质区别:

  1. 当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符,sizeof(a) = 10 。而定义 char *s 时,这是个指针变量,只占四个字节,sizeof(s) = 4,32位,用来保存一个地址。
  2. printf(“%p”,s); 表示 s 的单元中所保存的地址。
    printf(“%p”,&s); 表示变量本身所在内存单元地址。

用一句话来概括,就是 char *s 只是一个保存字符串首地址的指针变量char a[ ] 是许多连续的内存单元,单元中的元素为char,之所以用 char *能达到char a [ ] 的效果,还是字符串的本质,地址,即给你一个字符串地址,便可以随心所欲的操所他。但是char* 和 char a[ ] 的本质属性是不一样的。

最后

以上就是愤怒大米为你收集整理的c语言 数组和字符串的全部内容,希望文章能够帮你解决c语言 数组和字符串所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部