c语言基础2—数组、字符串、指针

来源:互联网 发布:种族电影知乎 编辑:程序博客网 时间:2024/05/12 04:31

一、数组

1、一维数组的初始化,先定义后初始化,在定义的时候一定要给数组元素个数。 int age[5];   age[0]=5;

2、定义同时初始化int age[5] = {1,2,3,4,5};

3、定义同时部分初始化,未初始化的值为0。int age[5] ={1,2};         int age[5] = { [3]=4, [4]=5};  

4、 不给定数组元素个数初始化,此时数组中元素有5个。 int age[] = {1,2,3,4,5};

5、 注意如下定义是不合法的,没有给定数组元素个数,如何初始化。 int age[]; 

6、 注意如下初始化是不合法的。int age[5] ;    age = {1,2,3,4,5};

7、注意如下也是不对的,数组下标只能是常量值。int count = 5;    int  age[count] = {0,1,2}; 

8、但如下写法是可以的,未初始化的元素值不确定。int count = 5; int age[count]; age[0]= 4; age[1]=5; 

9、sizeof(age)/sizeof(int)计算数组的长度,数组名这个常量的算数运算所加值的大小,是等同于数组元素的字节数,编译器运算。

10、数组名就可以当数组的地址,数组的地址就是首元素的地址。

11、基本数据类型作为参数是值传递,当想对基本数据类型的参数进行值更改时,则需要使用指针。

12、指针和数组并不是想等,int a[5]和int *b,a和b可以互换么,他们都具有指针值,他们都可以进行间接访问和下标引用。在声明一个数组时,编译器会根据声明所指定元素的数量分配内存空间,然后再创建数组名,它的值是一个常量,一个常量值是不能更改的,a++等对自身值改变的事件时不能的,但*(a+2)代表是去数组的第三个元素的值,并未对a常量的值进行改变,当然可以。声明一个指针变量的时候,编译器只会给指针本身分配内存空间,指针变量并未指向任何空间。这是你*a是合法的,应为有内存空间,里面有值可取。但*b没有指向任何空间,你访问它将发生错误。

13、数组元素的三种访问方式int a[5]   int *p = a ,数组下标,指针*(p+1),指针变量下标p[i]。



二、字符串

1、在c语言中,并没有显示的字符串数据类型,而是以字符常量,或者存储于字符数组中,但字符数组可以不包含NUL,在字符串的末尾默认有一个字符串结束标记’\0’字符,'ASCII码值为0。字符串所包含的字符内部不能出现NUL字符。字符串在定义的时候可以写成如下方式。

[java] view plai
  1. char name[5] = “it”;
  2. char name[5] = {‘i’,’t’,’\0’};
  3. char name[5] = {’i’,’t’,0};



2、strlen函数使用注意,在计算字符串长度的时候,他会遇到'\0’就停止计算。char name[] = {‘2’,’0’}; 这样的字符数组,strlen函数是计算不出来的,因为他不是一个字符串,不包含’\0’。

3、字符串数组 

[java] view plai
  1. char name[2][10] = {“jack”, “tom”};//字符数组

  2. char *name[5] = {“jack”, “tom”};//指针数组

4、定义字符串的两种方式区别

[java] view plai
  1. char name[3] = “it”;//这里面的值可以随便改
  2. //使用场合,字符串的内容需要经常修改

  3. char *name = “it”;//字符串常量,里面的字符是不能改的
  4. //同时这个it放到常量区,整个内存只有一份
  5. //使用场合字符串的内容需要经常访问

  6. printf(“%s”,name2);//他会输出整个字符串,机制是遇到’\0’结束



三、指针

1、为初始化和非法的指针:指针变量只能存储地址,在指针变量确定指向之前,也就是没有初始化,不要去访问他。下面的两行代码说明了一个极为常见的错误.int *a; *a = 12;这里声明了一个名叫a的指针变量,12存储在a所指向的内存位置。我们声明一个名叫a的指针变量,但从未初始化,是没有办法预测12会存储到什么位置上的。

2、空指针:NULL指针作为一个特殊的指针变量,表示不指向任何东西,要使一个指针变量为空,你可以给它一个零值。同时为了测试一个指针变量是否为空,你可以和0进行比较。一种良好的编程风格 ,在定义一个指针变量后,如果你知道他的初始地址,则初始化,否则应该给他一个NULL。对空指针进行访问,有些机器会报错,有些编译起则会隐藏。

3、指针变量的内容:指针变量存储的是地址,指针变量的初始化用&来完成。

4、间接访问操作符:也就是*,通过一个指针变量访问所指向的地址的过程称为间接访问或解引用指针。访问指针变量所指向的那块内存空间的值。其实可以想着*后面加的是地址,访问地址所指向的那片存储空间的值,如果那片存储空间的值还是地址,我在加个*就在访问地址的值,就相当于访问指针的指针。 (*(*p))解析 p为指针变量,里面存的肯定是地址,前面有颗*那就是访问p地址指向的那片内存里存的值,正好这个地址也是个地址,那么我在来一颗*,是不是就是访问这个地址所指向内存的值,也就是指向指针的指针。

[java] view plai
  1. int a = 12;
  2. int *b = &a;
  3. int **c = &b;
  4. //修改a的值的三种方法 
  5. a=20; *b = 20; **c = 20;

#include <stdio.h>
#include <string.h>
void sort(char p[][128],int l);
int main()
{
    char strings[6][128];
   printf("请输入6个只包含字母和数字的字符串:");
    for(int i=0;i<6;i++)
    {
        scanf("%s",strings[i]);
    }
    sort(strings,6);
    printf("由小到大的排列结果是:\n");
    for(int i=0;i<6;i++)
    {
        printf("%s\n",strings[i]);
    }
    return0;
}
void sort(char p[][128],int l)
{
    int i,j;
    char temp[128];
    
    for(i=0;i<l-1;i++)
    {
        for(j=i+1;j<l;j++)
        {
            //if(strcmp(p[i],p[j])>0)
            if (strlen(p[i])>strlen(p[j]))
            {
               //数组不能直接复制,需要使用函数拷贝,如果使用指针数组可以直接赋值
                /*temp=p[i];
                 p[i]=p[j];
                 p[j]=temp;*/
                strcpy(temp, p[i]);
                strcpy(p[i], p[j]);
                strcpy(p[j], temp);
            }
        }
    }
}




0 0
原创粉丝点击