C语言数组 指针赋值相关问题

152题 不是只给指针定义了 没有分配内存吗 为什么可以直接赋值
182题怎么得来的
207题A中的*a++难道不是和D一样不对吗 改变首地址常量

img

img

img

152:指针指向的是一个首地址,题目定义了首地址p,后面直接可以给他赋值,从首地址开始填充数据;

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7673640
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言从键盘上输入一个字符串,存放在a数组中,并在该串中的最大元素后边插入一个字符
  • 除此之外, 这篇博客: C语言——遗忘知识点回忆记录中的 61. 在函数定义中,数组的形参 a 实际上是一个指针。当进行参数传递时,主函数传递的是数组 a 的基地址,数组元素本身不被复制。作为一种表示习惯,编译器允许在作为参数声明的指针中使用数组方括号。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  

  • 以下回答由chatgpt基于相关博客总结生成:
    1. 在第152题中,为什么可以直接给指针赋值而不需要分配内存? 答:在C语言中,指针本身并不占用内存,只是一个指向内存地址的变量,因此可以直接给指针赋值。例如:
    int a = 10; // 定义一个整型变量
    int *p = &a; // 定义一个指向整型变量a的指针,并将其指向a的地址
    

    虽然指针本身不占用内存,但是当使用指针时,可能需要分配内存来存储指针所指向的变量或对象。

    1. 第182题的答案是怎么得到的? 答:第182题要求编写一个函数将一个字符串反转,其C语言代码如下:
    void reverse(char *s)
    {
        char temp;
        int len = strlen(s);
        for (int i = 0; i < len / 2; ++i) {
            temp = *(s + i);
            *(s + i) = *(s + len - i - 1);
            *(s + len - i - 1) = temp;
        }
    }
    

    该函数的参数为一个指向字符串的指针,函数内部使用指针操作来完成字符串的反转。具体来说,这个函数使用strlen函数来获取字符串的长度,并使用指针操作将字符串的左右两侧的字符逐个交换。例如,对于字符串"abcde",经过一次循环后,s指向的字符串就会变为"edcba"。依次循环下去,最终就可以得到反转后的字符串。

    1. 在第207题中,为什么A选项中的*a++和D选项一样是不对的,因为它们都改变了指针的首地址常量,请问是否理解正确? 答:在C语言中,指针变量本身是可以改变的,但指针的地址常量不能改变。例如:
    int a = 10;
    int *p = &a; // 将指针p指向a的地址
    p++; // 可以将指针p指向a在内存中的下一个位置,但无法改变p指针的地址常量
    

    上面的语句执行后,指针p指向了a后面的一个位置(也就是p增加了4个字节),但p的地址常量仍然指向a的地址。因此,在第207题中,选项A和D都是错误的,因为它们试图改变指针的地址常量。正确的选项应该是B或C,这两个选项中仅修改了指针指向的变量(即将(*p)++),而没有修改指针的地址常量。

182: pl是 int即整型指针, 一个整型指针不能套两层 [ ] 所以B选项语法就过不去
p是 int(
)[3]即指向含3个int类数组的指针, p=a意思是p和a在调用时是等价的, 这在函数传参时比较有用.