首页 > 编程语言 >C++ 初学者如何正确使用指针

C++ 初学者如何正确使用指针

时间:2023-08-11 11:35:10浏览次数:44  
标签:变量 指向 int 定义 C++ 地址 初学者 指针

一、指针的基本概念

  指针是C++中非常重要的概念,也是初学者经常会遇到的问题。指针是一个存储变量地址的变量,它指向存储器中的一个地址。使用指针可以直接操作存储器中的数据,因此常用于处理复杂的数据结构和算法。

二、指针的定义和使用

  定义指针以及使用指针的步骤如下:

1 // 定义指针
2 int *p;
3 // 指针指向一个变量
4 int a = 10;
5 p = &a;
6 // 通过指针访问变量
7 *p = 20; // a的值变为20

  指针需要指向一个变量,即需要将一个变量的地址赋值给指针。可以使用取地址符“&”获取一个变量的地址,并将地址赋值给指针。使用指针访问变量的值时,需要使用解引用符“*”,可以理解为从指针指向的地址中取出变量的值。

三、指针和数组

  指针和数组是密不可分的,因为数组本质上就是一段连续的内存空间,每个元素在内存中的地址是连续的。可以使用指针对数组进行访问:

1 int arr[] = {1, 2, 3, 4, 5};
2 int *p = arr; // 指针指向数组的第一个元素
3 for(int i = 0; i < 5; i++){
4     cout << *(p + i) << endl; // 通过指针访问数组元素
5 }

  在指针和数组中,需要注意指针越界问题。使用指针访问数组元素时,要确保指针不会越界,否则会导致程序崩溃。

四、指针和函数

  指针和函数密切相关。可以定义指针类型的参数,从而可以将变量的地址传递给函数,从而在函数内部直接修改变量的值,而不需要返回值。

 1 void swap(int *a, int *b){
 2     int temp = *a;
 3     *a = *b;
 4     *b = temp;
 5 }
 6 
 7 int main(){
 8     int x = 10, y = 20;
 9     swap(&x, &y); // 将x和y的地址传递给函数
10     cout << x << " " << y << endl; // 20 10
11     return 0;
12 }

  这里定义了一个函数swap,接收两个指针类型的参数a和b,交换指针所指向的变量的值。在主函数中,调用swap函数时需要将x和y的地址传递给函数。调用结束后,x和y的值也被交换了。

五、指针和动态内存分配

  指针和动态内存分配也是密切相关的。在C++中,可以使用new运算符动态地分配内存。分配后会返回所分配内存块的首地址,需要使用指针来接收它:

1 int *p = new int; // 动态分配一个整型变量
2 *p = 10; // 对指针所指向的变量进行赋值
3 delete p; // 释放动态分配的内存

使用new运算符可以在程序运行时动态分配内存,在指针访问结束后需要使用delete运算符释放内存,否则会产生内存泄漏的问题。

六、指针和常量

  指针和常量也是有关系的。可以定义一个指向常量的指针,或者定义一个常量指针。定义一个指向常量的指针时,不能通过指针来修改所指向变量的值。定义一个常量指针时,指针本身是一个常量,不能修改指针所指向的地址。

1 const int *p1 = &a; // 定义一个指向常量的指针,不能修改a的值
2 int *const p2 = &a; // 定义一个常量指针,不能修改指针的值

  这里定义了一个指向常量的指针p1,指针不能修改所指向变量a的值。定义了一个常量指针p2,指针本身是一个常量,不能修改指针所指向的地址。这两种方式的应用取决于要解决的问题。

七、指针和空指针

  空指针是一个特殊的指针,它不指向任何地址。在C++中,可以使用NULL或nullptr来定义一个空指针。针对空指针的操作需要进行特殊处理,否则会出现程序崩溃的问题。

1 int *p = nullptr;
2 if(p == nullptr){
3     cout << "p是空指针" << endl;
4 }

  这里定义了一个空指针p,并且判断p是否指向了一个有效的地址。在使用空指针时需要进行非空判断,确保指针指向了有效的地址。

标签:变量,指向,int,定义,C++,地址,初学者,指针
From: https://www.cnblogs.com/ybqjymy/p/17622595.html

相关文章

  • C++ 字符串拼接技巧(stringstream、字符串迭代器、字符串的加法运算符、std::accumulat
    在C++中,经常需要将多个字符串拼接成一个大字符串。这个过程很容易出错,但有一些技巧可以帮助我们轻松地实现这个目标。本文将介绍一些C++中join字符串的技巧。一、使用stringstreamstringstream是一个流。使用它可以将多个字符串连接起来,然后将它们转换为一个字符串。可......
  • 初学者Java应该学jdk什么版本?
    Java的多个版本在历史上都有其重要性,但对于初学者而言,选择合适的版本来学习非常关键。以下是对于初学者来说选择JDK版本的一些建议:1.考虑最新稳定版本最新版本:目前JDK17是最新的长期支持版本(LTS)。选择最新的LTS版本作为学习起点是个不错的选择,因为它结合了稳定性和较新的特性。2.......
  • C++高质量问答精选
    https://stackoverflow.com/questions/21204676/modern-way-to-filter-stl-containerhttps://stackoverflow.com/questions/4303513/push-back-vs-emplace-back......
  • 《C++ GUI Qt4编程》第2章——创建对话框——深入介绍信号和槽
    槽和普通的C++成员函数几乎是一样的——可以是虚函数;可以被重载;可以是公有的、保护的或者私有的,并且也可以被其他C++成员函数直接调用,它们的参数可以是任意类型。唯一不同的是:槽还可以和信号连接在一起,在这种情况下,每当发射这个信号的时候,就会自动调用这个槽。connect(sender,SI......
  • C++系列二:STL教程-容器+迭代器
    目录前言容器迭代器前言……。容器//容器种类 功能1.序列容器 主要包括vector、list、deque。元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。2.排序容器 包括set、multiset、map、multimap。排序容......
  • C++面试八股文:如何实现一个strncpy函数?
    C++面试八股文:如何实现一个strncpy函数?某日二师兄参加XXX科技公司的C++工程师开发岗位第31面:面试官:strcpy函数使用过吧?二师兄:用过。面试官:这个函数有什么作用?二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。面试官:strncpy函数也使用过吧,和strcpy有......
  • C++之输入输出流(控制台打印/读取数据)
    C++与流stream相关的头文件/库iostreamfstreamsstream分别对应:控制台IO流/文件流/字符串流,本文主要介绍控制台输出输出流cin>>空格分隔cout<<控制台输出已知待读取元素的数量:cin>>n未知待读取元素的数量:while(cin>>val)另外,可以整行读取数据,然后再解析字......
  • C++友元函数和友元类的使用
    1.友元介绍在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。友元可以分为两种类型:类友元和函数友元。2.类友元类友元(Friend......
  • Leetcode167. 两数之和 II - 输入有序数组(双指针)
    题目:两数之和II-输入有序数组(双指针)给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1<=index1<index2<=numbers.length......
  • 五子棋_c++版
    #include<bits/stdc++.h>usingnamespacestd;intlie=16,hang=16,lie_shu,hang_shu;intblack_flag[16][16];boolblack=true;intall[16][16];voidf5(){system("cls");for(intj=0;j<=hang;j++){cout<<setw(3)<<......