• 指针相关总结2


    1.指针和int常量的用法都也忘光光了
    int a = 1;//指针指向变量单元,不能指向int常量,所以要有a来存储.
    int *p = &a;//等价于int *p; p = &a;但绝不可以写作:int *p; *p = a;//这样会报p未初始化的错误,p需要p = &a这样的初始化。
    *p = 2;//因为有之前的初始化,才可以这样做.
    
    有一种编译时不报错,运行时报错的写法:
    int *p = NULL;
    *p = 2;
    这符合c的语法,编译不报错,因为已经对p初始化了.但是空指针表明自己不再指向任何对象.

     2 字符串指针与字符数组的区别

    问题1:
    void main(){
    char *s=new char[5];  //更规范的写法是new(std::nothrow), 然后判断下是否为NULL
    s="abcd";  //这里直接指向的写法浪费new的感情,你并没有利用堆上的内存; 写成strcpy(s, "abcd")就OK了
    s[2]='y';
    }执行时会有内存读写错误,但是改为:
    void main(){
    char s[]="abcd";
    s[2]='y';
    }却没有错误,我知道变量一个在堆区,一个在栈区,为什么会出现这个问题
     
    回答
    关键是s="abcd"有问题,即使s不是动态指针(比如char * c="hello"),也会报错。
    char *s只是个指针而已,没有分配存储空间的,(指针只是指向某一块内存)
    而"abcd"字符串常量,它是被储存在内存的静态区中的,静态区中的数据是不能被更改的,
    
    char s[]="abcd"等于是你在栈中为s开辟了一个5字节的空间(数组是自己有开辟了内存)
    等价于char s[5],所以这个时候你把一个字符s[2]='y'等于是把y放入了栈中
    
    问题2:
    关于strcat()(连接函数)的第一个参数, char a[] = "abcd"; char* b = "abcd"; char c[] = "efg"; strcat(b, c)运行出错,可是为什么strcat(a,c)可以? 最佳答案: 其实strcat(b, c),strcat(a,c)都有错 通俗的来讲: strcat(b, c)运行出错是因为b是一个指向常量字符串的指针,指向的是一片不能运行时改变的内存区域,向内存区域中写入其它的数据,必然会使程序崩溃;而a则是指向一个变量内存区域,是可以动态改变的,
    a虽然没有足够的空间导致溢出(因为char a[]
    = "abcd",数组的长度为5,固定下来了),但c语言不检查数组越界,依然可以写入,但是写入的内纯区域已经不受控制,说不定就覆盖了某些其它变量,是很危险的操作.需要保证被被拼接方有足够的内存. 注意char a[] ={'a','b','c','d'}; 数组a的长度为4, char a[] = "abcd",数组a的长度为5,等价于char a[] ={'a','b','c','d.'0''}; 4.声明指针变量时系统分配的内存,和指针所指向的内存 这么跟你说,指针本身也是一种变量,就和int型一样,假如你声明int a,其中a是变量名,有自己的一个地址,然后a的值,是另外一个地址,计算机通过变量名就能知道变量值是多少,同样的道理,你声明int *p,*p是变量名,
    在计算机中是有独立的内存空间用来存放*p的,这样明白吗?只有当你给*p赋值的时候,*p才会指向其他的内存空间,存放指针变量本身的内存是一直都在的,也就说声明指针变量时系统分配的内存,和指针所指向的内存,是两个不同的概念
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    关于秒杀的系统架构优化思路
    如何设计一个秒杀系统
    RabittMQ实践(二): RabbitMQ 与spring、springmvc框架集成
    RabittMQ实践(一): RabbitMQ的安装、启动
    Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
    Linux 网络 I/O 模型简介(图文)
    Java 网络编程(六) 使用无连接的数据报(UDP)进行通信
    Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
    Java 网络编程(四) InetAddress类
    Java 网络编程(三) 创建和使用URL访问网络上的资源
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/11865908.html
Copyright © 2020-2023  润新知