[ ] 和 * 的区别

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

//数组 int a[10]
//字符串
// 1 C语言的字符串 是以零结尾的字符串
// 2 在C语言中没有字符串类型  通过字符数组 来模拟字符串
// 3 字符串的内存分配 堆上 栈上 全局区(很重要)

// 字符数组  初始化
int main1(void)
{

    //1 指定长度
    char buf2[100] = {'a','b','c','d'};
    //1 -1 char buf3[2] = {'a','b','c','d'};//如果初始化的个数大于内存的个数 编译错误 初始化项太多
    //1 -2 //后面的buf2[4]-buf2[99]都为0

    //2 不指定长度 C编译器会自动帮程序员  求元素的个数
    char buf1[] = {'a','b','c','d'}; //buf1是一个数组 不是一个以0结尾的字符串
    
    return 0;
}

//用字符串 来 初始化字符数组
//strlen()  长度不包括 0
//sizeof()  内存块的大小
int main2(void)
{
    int size = 0;
    char buf3[] = "abcd"; //buf3 作为字符数组  应该是5个字节  //作为字符串  应该是4个字节

    int len = strlen(buf3);
    printf("buf3字符的长度:%d\n", len);  //4

    //buf3 作为数组 数组是一种数据类型  本质(固定大小内存块的别名)
    size = sizeof(buf3);
    printf("buf3数组所占内存空间大小:%d\n", size); //5
    {
        char buf4[128] = "abcd"; 
        printf("buf4[100]:%d \n", buf4[100]);
        len = strlen(buf4);
        printf("buf4字符的长度:%d\n", len);  //4
        size = sizeof(buf4);
        printf("buf4数组所占内存空间大小:%d\n", size); //128
    }

    return 0;
}

//通过数组下标 和指针
int main(void)
{
    int i = 0;
    char *p = NULL;
    char buf5[128] = "abcdefg";  //临时区分配的内存,程序运行完就释放内存,故buf5不能修改

    for(i = 0; i < strlen(buf5); i++)
    {
        printf("%c ", buf5[i]);
    }
    p = buf5; //buf5 代表数组首元素的地址

    for(i = 0; i < strlen(buf5); i++)
    {
        //printf("%c ", *(p+i));
        printf("%c ", *(buf5+i));
    }

    /*[] *的推导过程
    buf5[i] ====> buf5[0+i]; =====>buf5(0+i); ===>*(buf5+i);
    */
    {
        //buf5 = buf5 +1;  //error C2106: “=”: 左操作数必须为左值
        //buf5 = 0x11; //error C2106: “=”: 左操作数必须为左值
    }
    return 0;
}

//[]的本质  和 *P 是一样的, 只不过是符合程序员的阅读习惯
//buf5 是一个指针 , 只读的常量 buf5是一个常量指针  析构内存时,保证buf所指向的内存空间安全释放

[]的本质 和 *P 是一样的, 只不过是符合程序员的阅读习惯
buf5 是一个指针 , 只读的常量 buf5是一个常量指针 析构内存时,保证buf所指向的内存空间安全释放

char *buf = "abcdefg"; //全局区分配内存
char buf5[128] = "abcdefg"; //临时区分配的内存,程序运行完就释放内存,
故buf所指向的内存空间安全释放,buf5即内存首地址不能修改
posted @ 2017-04-24 16:57  Liu_Jing  Views(449)  Comments(0)    收藏  举报