C语言 字符串、数组和指针

C语言 05/06 阅读 17 views次 人气 0
摘要:

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。

代码实例:

#include <stdio.h>

/**
 主函数
 @param argc argc description
 @param argv argv description
 @return return value description
 */
int main(int argc,const char* argv[]){
    //一维字符数组
    char a[10];
    //二维字符数组
    char b[5][10];
    //给部分数组元素赋值
    char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'};
    //对全体元素赋值时可以省去长度
    char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' };
    
    //可以将字符串直接赋值给字符数组
    char str1[30] = {"utajets.com"};
    char str2[30] = "utajets.com";
    char str3[] = {"utajets.com"};
    char str4[] = "utajets.com";
    // 用字符串给字符数组赋值时由于要添加结束符 '\0',
    // 数组的长度要比字符串的长度(字符串长度不包括 '\0')大1。
    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);
    printf("str3: %s\n", str3);
    printf("str4: %s\n", str4);
    
    //i1取地址(&)将值赋给指针i2,也就是说这个指针i2指向i1。
    int i1 = 10;
    int *i2 = &i1;
    printf("i1=%d\n",i1);
    // 结果是一个地址
    printf("i2=%p\n",i2);
    // 输出实际结果
    printf("i2=%d\n",*i2);
    // 结果是一个地址(指针的地址,因为指针也是一个变量自己也有地址的)
    printf("i2=%d\n",&i2);
    
    //数组名是一个地址,它可以被理解为一个常指针
    //它只能指向本数组首元素的地址,而指针可以指其他的变量等等。
    int string[5]={1,2,3,4,5};
    int *p=string;
    //输出为1,数组的首元素。
    printf("%d\n",*p);
    //输出为1,数组的首元素。
    printf("%d\n",*string);
    //输出为1,数组的首元素。
    printf("%d\n",string[0]);
    //输出为地址,数组的地址。
    printf("%p\n",p);
     //输出为地址,数组的地址。
    printf("%p\n",string);
    //输出为2,数组的第二个元素。
    printf("%d\n",*(p+1));
     //输出为2,数组的第二个元素。
    printf("%d\n",*(string+1));
    
    char *month[] = {"January","February","March","April",
        "May","June","July","August","September","October",
        "November","December"};
    char *curMonth = month[4];
    printf("当前月份为:%s\n",curMonth);
    printf("当前月份为:%s<-%#X\n", curMonth, &curMonth);
    
    int aa=10,bb=20;
    //无法使p指向其他地址
    int *const pp=&aa;
    //pp=&bb; -> 这样的操作是不允许的。
    *pp=20; //可以这样操作。
    printf("%d\n",*pp);
    printf("%#X\n",pp);
    
    const int *ppp=&aa;     //p可以指向其他地址。
    ppp=&bb;                      //可以操作。
    //*p=10;  操作不被允许。
    printf("%d\n",*ppp);
    printf("%#X\n",ppp);
    
    //p不能指向其他地址,也不能改变地址中的值。
    const int * const pppp=&a;
    //操作不被允许 p=&b;
    //操作不被允许 *p=20;
    printf("%d\n",*pppp);
    
    int x=10;
    int *y=&x;
    int **z=&y;
    printf("y=[%d]\n",*y);
    printf("z=[%d]\n",**z);
    
    return 0;
}


*p:一级指针,表示p所指向的地址里面存放的是一个类型的值。

**p :二级指针,表示p所指向的地址里面存放的是一个指向类型的指针。


空指针和野指针

在函数内部对指针进行赋值操作后,在函数执行完毕后,该指针就成了一个空指针(变量从栈中弹出)。但是通过动态地址分配(堆空间)的指针不会有上述问题。

free(p)后释放内存的指针为野指针。


const在int的左边那就是不能修改地址中的值,在右边就是不能指向其他地址,左右都有那就是既不能修改地址的值也不能指向其他地址。


评论

  1. 栀子花开遇见你 作者 人不要等明天,因为没有人知道自己有没有明天。

    C语言中的数组本质上其实也是指针,即:*a 等同于 a[]。

    2019/05/06 回复

分享到: