150

问答题 150 /413

请你回答一下什么是指针,以及指针和数组的区别,指针和引用的区别

参考答案

参考回答:

指针就是一个存放地址的变量,当指针指向某个变量,这时这个指针里就存放了那个变量的地址

指针与数组的区别

1、指针和数组的分配,数组是开辟一块连续的内存空间,指针不是

2、空间分配,   这里又分为两种情况。
第一,如果是全局的和静态的
char *p = “hello”;
这是定义了一个指针,指向rodata section里面的“hello”,可以被编译器放到字符串池。在汇编里面的关键字为.ltorg。意思就是在字符串池里的字符串是可以共享的,这也是 编译器优化的一个措施。
char a[] = “hello”;
这是定义了一个数组,分配在可写数据块,不会被放到字符串池。
第二,如果是局部的
char *p = “hello”;
这是定义了一个指针,指向rodata section里面的“hello”,可以被编译器放到字符串池。在汇编里面的关键字为.ltorg。意思就是在字符串池里的字符串是可以共享的,这也是 编译器优化的一个措施。另外,在函数中可以返回它的地址,也就是说,指针是局部变量,但是它指向的内容是全局的。
char a[] = “hello”;
这是定义了一个数组,分配在堆栈上,初始化由编译器进行。(短的时候直接用指令填充,长的时候就从全局字符串表拷贝),不会被放到字符串池(同样如前,可 能会从字符串池中拷贝过来)。注意不应该返回它的地址。

3、使用方法

如果是全局指针,用于不需要修改内容,但是可能会修改指针的情况。如果是全局数组,用于不需要修改地址,但是却需要修改内容的情况。如果既需要修改指针,又需要修改内容,那么就定义一个数组,再定义一个指针指向它就可以了。

指针和引用的区别

1、指针是一个变量,只不过这个变量存储的是一个地质,而引用跟原来的变量实质上是一个东西,只不过是原变量的一个别名

2、引用不可以为空,当被创建的时候,必须初始化,而指针可以是空

3、指针可以有多级,但是引用只有一级

4、指针的值在初始化后可以改变,但是引用进行初始化后就不会再改变了

5、sizeof引用得到的是指向变量的大小,而指针得到的是本身的大小

6、如果返回动态分配的对象或内存,必须使用指针,否则可能引起内存泄漏