zoukankan      html  css  js  c++  java
  • c基础补充

    一:字符串
    在C语言中 字符串一般是动态分配和字符数组两种形式 动态分配的时候字符串字符串指针是4个字节 字符串的大小根据自己的需要来申请
    比如:
    char * c;//C为字符串指针 占用四个字节
    c = (char*)malloc(sizefo(char) * N); //N为字符串中字符的个数

    C语言中如何定义字符串?

    一维和二维的都可以;
    一维的情况如下:
    1,char string0[10];
    2,char string1[]="prison break";
    3,char string2[100]="michael scofield";
    1句表示定义个长度为10的字符串,但未赋值,2句表示定义了一个字符数组string1,并进行初始化,使得其长度自动为13(字符串”prison break"中的字符个数加上结尾的''),3句定义了一个有100个元素的字符数组string2,并初始化了17个元素("michael scofield";加上结尾的'');
    二维的情况如下:
    1,char string3[6][30];
    2,char string3[6][30]=;
    此句表示有6个字符串,每个字符串的长度为30,每个字符串的初始值与“joy","phosee","monses","chandele","ross","rather"相对应;

    在C中定义字符串有下列几种形式:字符串常量,char数组,char指针

    1.字符串常量

       即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志字符,作为

    一个字符串存储在内存中。如:printf("%s","hello"); //"hello"

        如果字符串文字中间没有间隔或间隔的是空格符,ANSI  C 会将其串联起来。例:

         char greeting[50] = "hello,and" "how are" "you";

       等价于:

         char greeting[50] = "hello,and how are you";

      字符串常量属于静态存储类。静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,

    该字符串在程序的整个运行过程中只存储一份。整个引号的内容作为指向该字符串存储位置的指针。这一点与

    把数组名作为指向数组存储位置的指针类似。

    2.字符串数组及其初始化

       初始化例子:

          char m[40] = "hello,world";  //定义字符串数组时必须指定数组大小(整型常量),在指定大小时,要确保数组的大小比预定的大一个,因为编译器会自动添加''。

                                                 //多余的元素会初始化为''

     

          char m={'h','e','l',''};  //注意标志结束的空字符,若没有它,得到的只是一个字符数组而不是字符串

    3.利用char指针定义字符串

           char *m = "hello,world"; //自动添加''

          注意:此时字符串指针m指向字符串常量,不成用*(m+1)='o'修改此常量,因为这个字符串常量放在常量区不能被修改

    4.数组和指针

       数组形式和指针形式有什么不同呢?

           数组形式: char m[40] = "hello,world"; 

           指针形式: char *m = "hello,world";

       数组形式:

     

    •      编译器会把数组名m看作是数组首元素的地址&m[0]的同义词,m是个地址常量。可以用m+1来标识数组里的下一个元素,但不能使用++m,增量运算符只能在变量前使用, 而不能在常量前使用。
    •      m[40]在计算机内存中被分配一个有40个元素的数组(其中每个元素对应一个字符,还有一个附加的元素对应结束的空字符'')。每个元素都被初始化为相应的字符。  
                 通常,被引用的字符串存储在可执行文件的数据段部分;当程序被加载到内存中时,字符串也被加载到内存中,把被引用的字符串复制到数组中
        指针形式:
    •      指针形式(*m)也会在静态存储区为字符串预留空间。此外,一旦程序开始执行,还要为指针变量m另外预留一个存储位置,以在该指针变量中能够存储字符串的地址。
    •       m指向字符串的第一个字符,可用++m指向第二个字符。  指针m是个变量。    
     


    例一:
    #include<stdio.h>
    main()
    {
    struct abc{
    int a;};
    struct abc *p;
    p->a=1;
    pritnf("%d",p->a);
    }
    这个编译没有问题,但是运行是段错误,请问为什么呢,谢谢了

    答:
    因为你定义了一个结构体指针p,用来指向此类结构体,但是你却没有给他赋值,此时p的值为NULL,你并没有在内存中为p分配任何空间,所以p->a=1这句就会出段错误。
    修改方法1:可以给p分配一段内存空间,并使其指向此空间:
    p=(struct abc *)malloc(sizeof(struct abc));
    p->a = 1;
    方法2:可以让p指向一个已存在的内存空间:
    struct abc temp;
    p=&temp;
    p->a = 1;
    还有printf 拼写错误
  • 相关阅读:
    foundation框架—结构体
    OC语言BLOCK和协议
    OC语言description方法和sel
    OC语言类的本质和分类
    清除浮动的常用方法
    php动态读取数据清除最右边距
    css背景图片定位练习(二): background-position的百分比
    css背景图片定位练习(一)
    行高不设单位的好处 line-height:1.8
    background:transparent的作用
  • 原文地址:https://www.cnblogs.com/Alight/p/4061719.html
Copyright © 2011-2022 走看看