C数组与指针

#include 
#include 

void pArray(char *pstr)
{
    printf("pArray is %s\r\n", pstr);
    printf("pArray + 1 addr %p\r\n", pstr + 1);
}

void pArray2(char (*pArr)[])
{
    printf("pArray is %s\r\n", pArr);
    // printf("pArray + 1 addr %p\r\n", pArr + 1); error: invalid use of array with unspecified bounds
}

void array(char str[])
{
    printf("pArray is %s\r\n", str);
    printf("pArray + 1 addr %p\r\n", str + 1);
}

int main(void)
{
    char AT_QICSGP[128] = "AT+QICSGP=1,1,\"CMHK\",\"\",\"\",1\r\n";
    char *pc = AT_QICSGP;
    char *ppc = &AT_QICSGP; // warning: initialization from incompatible pointer type
    char(*pppc)[128] = &AT_QICSGP;

    // printf("c addr %p\r\n", AT_QICSGP);
    // printf("pc addr %p\r\n", pc);
    // printf("ppc addr %p\r\n", ppc);

    // printf("c addr %p\r\n", AT_QICSGP + 1);
    // printf("pc addr %p\r\n", pc + 1);
    // printf("ppc addr %p\r\n", ppc + 1);

    // pArray(AT_QICSGP);
    // array(AT_QICSGP);
    // pArray2(AT_QICSGP);

    // printf("ppc addr %p, ppc+1 addr %p, &AT_QICSGP addr %p\r\n", pppc, pppc + 1, &AT_QICSGP + 1);

    // char *p = "hello";
    // char *p2 = "hello world";
    // printf("strlen(p) is %d, sizeof(p) is %d\r\n", strlen(p), sizeof(p));
    // printf("strlen(p2) is %d, sizeof(p2) is %d\r\n", strlen(p2), sizeof(p2));

    // 问题:
    // 如何在C语言中定义字符串

    // 结论:
    // 数组和指针的关系:
    // 0, 数组名等于指针,但是数组名不等于指针变量,即数组名是一个地址,不是一个变量
    // 1, c语言中没有字符串类型,字符串是以'\0'结尾的字符数组
    // 2, 字符串是字符数组,但是字符数组不一定是字符串,因为字符数组不一定以'\0'结尾,但是字符串一定以'\0'结尾
    // 3, 假如有一个字符数组str[128],对于str而言,&str 和 str 的值是一样的,都是数组的首地址
    // 但是,&str 的类型是 char (*)[128],而 str 的类型是 char *,这是两种不同的类型。
    // 所以,str 和 &str 的值相同,但是类型不同, str 是一个指针变量,&str 是一个指针常量

    // 例子:
    // char str[] = "123"; char *p = str; char *p2 = &str;
    // 在你提供的代码中,有一些问题需要注意:

    // 字符串的定义:当你声明一个字符串时,应该使用字符数组而不是字符变量。正确的方式是:
    //  Copy code➕ Insert code
    // char str[] = "123";
    // 这样,str将会是一个字符数组,用于存储字符串 "123"。

    // 指针的定义:在你声明指针变量时,使用了错误的语法。正确的方式是:
    //  Copy code➕ Insert code
    // char *p = str;
    // char *p2 = &str[0];
    // 这样,p和p2将会是指向字符的指针,分别指向str数组的第一个元素。

    // 下面是修正后的代码示例:

    //  Copy code➕ Insert code
    // char str[] = "123";
    // char *p = str;
    // char *p2 = &str[0];
    // 在上述代码中,str是一个字符数组,用于存储字符串 "123"。p和p2是指向字符的指针,分别指向str数组的第一个元素。

    // 需要注意的是,p和p2指向的是字符串的第一个字符,而不是整个字符串。如果你想操作整个字符串,可以使用指针来遍历整个字符串,或者使用标准库函数来操作字符串。

    return 0;
}

你可能感兴趣的:(C,c语言,开发语言)