zoukankan      html  css  js  c++  java
  • 指针相关总结2

    指针相关总结2

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

    问题:
    void main(){
    char *s=new char[5];
    s="abcd";
    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放入了栈中
     

    5.字符连接函数

    关于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.'''};
     

    6.声明指针变量时系统分配的内存,和指针所指向的内存

    这么跟你说,指针本身也是一种变量,就和int型一样,假如你声明int a,其中a是变量名,有自己的一个地址,然后a的值,是另外一个地址,计算机通过变量名就能知道变量值是多少,同样的道理,你声明int *p,*p是变量名,在计算机中是有独立的内存空间用来存放*p的,这样明白吗?只有当你给*p赋值的时候,*p才会指向其他的内存空间,存放指针变量本身的内存是一直都在的,也就说声明指针变量时系统分配的内存,和指针所指向的内存,是两个不同的概念
     
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    ionic入门之AngularJS扩展基本布局
    ionic入门之AngularJS扩展(一)
    test
    面试题小整理
    使用Code first 进行更新数据库结构(数据迁移)
    SQL模糊查询与删除多条语句复习
    GridView 根据要求显示指定值
    个人工作记录---工作中遇到的sql查询语句解析
    数据库,inner join,left join right join 的区别
    利用set实现去重
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/9343305.html
Copyright © 2011-2022 走看看