指针部分释疑
一、指针的实质
在学习C/C++过程中,可能大多数学习者对指针都会产生厌烦乃至抵触情绪。的确,对于初学者来讲,指针是不好理解,也不好用,好多学习者喜欢采用不用指针的方式来解决问题,即“能不用指针就不用指针”,甚至把指针当成了人人喊打的“goto”来看待……
而其实,指针也是冤枉的,大家看到的都是指针的缺点,却没有人意识到指针的好处。那么,指针到底是什么,怎么用,怎么样才能用好?
1.到底什么是指针
从概念上来讲,指针其实是一种数据类型,没错,就是一种数据类型而已,我们看看C中的数据类型的概念——Data Type,呵呵,这么简单?对,就这么简单,翻译过来不就是“数据的类型”吗!接上文,指针也是一种数据类型,那么这个故事告诉我们指针真的很简单!
让我们就从数据类型讲起,就说大家都熟悉的整型:
int a = 5;
上面这句很简单,大家都知道,定义了一个整型变量a,并初始化其值为5。究其根本,我们看看系统做了什么——编译的时候系统向内存申请了2个字节(C的讲法,C++是4个字节)的空间,即16位,这两个字节是紧邻的,这只是第一步;第二步是在程序执行的时候,系统将整数常量5赋值给变量a,即将0000000000000101(二进制补码)赋值到刚才提及的两个字节中,那么系统是怎么通过a找到的这两个字节空间呢?很简单,系统是通过a(变量名称)找到了a所对应的空间,怎么找的呢?这就要提到一个运算符“&”,在C中叫做地址运算符,是一个单目运算符,将其加在变量之前,即“&a”,就是a所对应的两个字节的空间编号,叫做什么呢?——“地址”(address),对,很形象!!!但地址又是什么?想想我们写信的时候在信封上写的东东,就很简单了不是吗!
这里有必要提一句,地址在系统中是采用十六进制数表示的,在C中可以写成例如0x54FE7AB5,但C又很小气的规定编程人员不能直接对地址进行操作(为什么就不再赘述了),那怎么办?就出来一个运算符“&”。所以,&a就是变量a在内存空间中申请的两个字节的低位字节的地址,如下例:
cout<<a<<&a;
执行后系统就会输出a的值5和a的地址0x********(*是十六进制数,自己写个程序试下)。
好,回来接着上面的话题,说指针——指针是什么?答:指针就是地址!!!
有点晕,刚刚才说过指针是一种数据类型,这么一会儿就又说指针是地址,什么意思啊……
重新来过:
int a = 5;
我们说我们定义了一个整型变量a,里面存放的数据必须是整型数据,ok?
int *p = &a;
是说我们定义了一个指针变量p,里面存放的是变量a的地址,这个还有问题吗?还有?哦,忘了说了,定义里面的“*”是干嘛的?定义变量的时候在标识符前面加上一个“*”就是说明定义的是一个指针变量!还有?“int”是干什么的?哦…还是说说“*”吧——
“*”在C中也是一个运算符,叫做“指针运算符”,也叫做“间接取值运算符”,前者比较伪善,后者相对实惠,对,就是间接取值的运算符,接下来我们说一下怎么使用a和p吧:
若要想访问a的话,例如赋值和输出,直接写成:
a = 20;
cout<<a;
肯定没有问题,是吧?那么p呢?注意看:
*p = 20;
cout<<*p;
这又是什么?*p?解释如下:
*为间接取值运算符,p为指针变量,放在一起就是“将p所指向的空间的内容取出来”,还不明白?再说一次“将p变量里面存放的地址拿出来,按照这个地址找到那个对应的空间,然后将空间中的内容取出来”,差不多了吧,但问题是,“那个空间”是多大的?系统怎么知道?或者说系统取值的时候,是按照字符型取值还是按照整型取值还是按照实型数取值呢?别急,再看p的定义“int *p = &a;”,看到没?在“*”前面有一个“int”,这就是说,我们定义了一个“指向整型变量的指针变量p”,如下例:
float a = 20.0;
int *p = &a;
这就不匹配了,可能有人问,系统遇到这种情况会怎么样呢?呵呵,我也不知道,打开你的TC或VC试一下不就知道了嘛……
总结一下:指针是一种数据类型,其有两层含义,一是静态的,即地址的含义,另一是动态的,即指向的含义,使用的时候我们经常用到两个运算符“*”和“&”,明白两个运算符的含义即可。由此,既然指针是一种数据类型,就可以定义所谓的指针变量,变量的应用大家都不会陌生是吧!(未完待续)
Ps:在使用指针变量的时候,一定要注意指针变量的指向问题,如果指针变量没有指向的话,很重要的原则就是不能使用之,切记!例如:
int *p;
*p = 20; //error,20赋到哪里去呢?
cout<<*p; //这个更离谱,你想输出什么?
分享到:
相关推荐
1. **指针的类型**:即指针本身的类型,通常是由指针声明语句中除去指针名的部分组成。 2. **指针所指向的类型**:指针指向的数据的类型,决定了编译器如何解释该数据。 3. **指针的值**:指针中存储的地址值,指向...
本质: 地址要用指针来存储,指针是用来存储地址的!!! 重难点: 指针指向的地址,也就是指针存储的地址!!! 就像整型数据要用整型变量来存储,整型变量是用来存储整型数据的! 地址: 地址值: ptr/&...
本文聚焦于 C++ 中的std::make_unique和std::make_shared这两个重要的智能指针创建函数。首先介绍 C++ 智能指针的背景和意义,阐述传统new操作符在内存管理方面的不足以及智能指针如何解决这些问题。详细讲解std::...
使用指针可以进行动态内存分配,这是C语言中最常用的技术之一。通过 `malloc()` 和 `calloc()` 函数可以分配内存,并通过指针指向这块内存区域。 #### 九、指针的高级用法 除了基本的应用外,指针还有许多高级用法...
C语言指针知识点总结 指针是C语言最独特和令人...* 指向指针的指针(Pointer to a Pointer):一个指针指向另一个指针。 指针是C语言中最基本和最重要的概念之一。掌握指针的使用和概念对于编程者来说是非常重要的。
- **指针所指向的类型**:`int*(*)(int)`(指向接受一个整型参数并返回指向含有三个指向整型数据的指针的数组的函数的指针) #### 四、示例分析 为了更好地理解上述指针类型,我们通过具体的示例来进行进一步的...
在计算机操作系统中,鼠标指针是用户界面的重要组成部分,它为用户提供了一种直观的方式来与屏幕上的元素进行交互。模拟MAC系统的鼠标指针意味着在非Mac系统上,如Windows或Linux,我们可以实现与Mac OS类似的鼠标...
在IT行业中,指针是C/C++编程语言中的核心概念之一,它允许程序直接操作内存地址,从而提供了高效且灵活的数据处理方式。然而,指针的使用也常常伴随着潜在的问题,如指针越界、引用错误等。这篇分析将深入探讨指针...
《C和指针》是C语言学习的经典教材之一,由Charles R. K. Prata撰写。这本书深入浅出地介绍了C语言中的指针概念及其在编程中的应用,为读者提供了全面的理解和实践指导。这份资源包含了非扫描版的电子书、源代码以及...
在C和C++编程语言中,指针是一个重要的概念,它允许我们存储变量的内存地址,从而能够直接访问和修改该变量。理解不同类型的指针是掌握这两种语言的关键。让我们详细探讨一下标题和描述中提到的各个知识点: 1. **...
- 声明指针变量通常采用`类型名 *变量名`的形式,例如`int *pointer`声明了一个指向整型变量的指针。 - `*`在声明中表示变量是一个指针,而在表达式中则表示取指针所指的值。 5. **指针的赋值**: - 通过`&`...
1. 指针变量:一个用于存储内存地址的变量,我们可以通过指针访问和修改它所指向的变量的值。 2. 声明指针:使用*符号声明指针变量,如`int *p;`声明了一个指向整型变量的指针。 3. 指针初始化:通过&运算符获取变量...
#### 三、数组名与指针的相似之处 1. **作为地址使用**:数组名通常被视为指向数组第一个元素的常量指针。 2. **算术操作**:可以通过在数组名或指针上进行算术运算来访问数组中的元素。 3. **传递给函数**:数组名...
指针是一种保存变量地址的变量,是一种基本的计算机编程概念。它允许开发者直接访问和操作计算机内存中的变量,从而提供了更高的灵活性和控制力。 概念 在计算机中,内存是由存储单元构成的,每个存储单元大小为1...
1. **指针的类型**:指针本身的类型,可以通过去除指针名称后剩余的部分来确定。 - 例如:`int *ptr;`的指针类型为`int*`。 - `int (*ptr)[3];`的指针类型为`int(*)[3]`。 2. **指针所指向的类型**:通过指针访问...
### 函数指针和指针函数的区分及应用 #### 函数指针的理解与使用...通过以上介绍,我们可以看出函数指针和指针函数有着本质的区别,同时正确使用 `const` 可以帮助我们更好地控制程序的行为,提高程序的安全性和效率。
文章首先介绍了变量的内存实质,接着详细讲解了指针的基本概念及其与数组名的关系,随后探讨了`const int *pi`与`int *const pi`的区别,进一步讨论了函数参数的传递方式,并最后解释了指向另一个指针的指针以及函数...
彻底搞定 C 指针-指向另一指针的指针 指针是 C 语言中的一种基本数据类型,它允许开发者直接访问和操作内存中的某个地址。 pointer 的实质是内存地址,指针变量的值是某个变量的内存地址。今天我们将学习一个叫做...