指针相关总结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

 


 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才会指向其他的内存空间,存放指针变量本身的内存是一直都在的,也就说声明指针变量时系统分配的内存,和指针所指向的内存,是两个不同的概念

 

上一篇:Base64


下一篇:codeforces #591 div2 ABCD