自学内容网 自学内容网

(五)C语言的指针与数组

一.指针和指针变量是一个意思吗?它们的区别?

从严格意义上来说,指针和指针变量是不同的,指针就是地址值,是一个数据,而指针变量是C语言中的变量,要在待定区域开辟空间,要用来保存地址数据,还可以被取地址。

区别:
指针的本质就是地址!
指针变量的本质是变量,是用来存放地址的!也就是说指针变量是用来存放数据的。

二.一个指针变量占几个字节

一个指针在32位的计算机上,占4个字节;
一个指针在64位的计算机上,占8个字节。

32位的操作系统有一个32位的地址总线,这意味着它可以寻址的内存空间为2^32字节(4 GB)。指针用于存储内存地址,因此在32位系统中,一个指针的大小为32位,即4字节。同理64位的操作系统也是这样。

三.野指针产生的原因?如何避免产生野指针?

野指针概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针产生的原因:
1.指针未初始化就使用
2.指针越界访问
3.指针指向了一段已经释放的空间(指向了垃圾内存空间)

避免野指针的方法:
指针初始化
小心指针越界
指针指向空间释放即使置NULL
避免返回局部变量的地址
指针使用之前检查有效性

四.定义一个指针赋值字符串与定义一个数组赋值字符串有什么区别?

1.指针赋值字符串:
char *str = “Hello, World!”;
使用指针时,实际上是将指针指向字符串常量的首地址,字符串常量存储在只读的数据段,不能通过指针修改字符串的内容。

2.数组赋值字符串:
char str[] = “Hello, World!”;
使用字符数组时,会在栈上分配足够的空间来存储字符串的内容,并在数组的末尾添加 null 字符 (‘\0’),可以通过数组进行字符串的读写操作,因为它在栈上分配了一块可读写的内存空间。

总体而言,使用指针赋值字符串时,指针指向字符串常量,不能修改字符串内容。而使用字符数组赋值字符串时,数组在栈上分配一块内存,可以进行读写操作。

五.指针和数组的区别

1.数组要么在静态存储区,要么在栈上被创建。数组名对应着一块内存,其容量与地址在生命周期内保持不变。

2.指针可以随时指向任意类型的内存块,他的特征是可变。比数组灵活,但也危险。

六.指针函数和函数指针的区别

1.指针函数是一个函数,它的返回值是一个指针。
2.函数指针是一个指针,这个指针指向的对象是一个数组。

七.引用与指针的区别

(1)非空区别:指针可以指向NULL,引用必须指向某个对象
(2)可修改区别:指针可以指向不同的对象,引用总是指向初始化的对象
(3)合法性区别:在使用指针之前要判断是否为NULL,引用不需要判断

八.各种指针

NULL指针
NULL用于指示指针未指向有效位置。理想情况下,如果在声明时不知道指针的值,则应将指针初始化为NULL。
当由它指向的内存在程序中间被释放时,我们应该使指针为NULL。

悬空指针
悬空指针是没有指向正确内存位置的指针。当删除或释放对象时,如果不修改指针的值或者不置为NULL,就会出现悬空指针。
这时这个指针指向的内存可能被分配给了其他变量就会造成错误。所以是比较危险的。

野指针
就是只声明没有被初始化过的指针,他可能指向任何内存。


原文地址:https://blog.csdn.net/m0_55389449/article/details/140649551

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!