zoukankan      html  css  js  c++  java
  • 指针相关总结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
  • 相关阅读:
    mysql问题小结
    mysql批量执行sql文件
    VMware使用中常见问题
    mybaits中xml文件大于号和小于号的处理方法
    自调用匿名函数的三种写法
    Linux相关文章
    Linux常用命令
    不触发事件,vue子组件传值给父组件
    elementUi使用单选框,并且单击行的时候选中该条数据
    可以和正则表达式一起使用的4个字符串方法
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/11865908.html
Copyright © 2011-2022 走看看