C/C++——指针

C/C++——指针

​ 指针(pointer)就是内存单元的地址,它可能是变量的地址,也可能是函数的入口地址。如果指针变量存储的地址是 变量的地址,则称该指针为变量的指针(或变量指针);如果指针变量存储的地址是函数的入口地址,则称该指针为函数的指针(或函数指针)。

  • 1.指针变量的定义

​ 指针类型的变量是用来存放内存地址的。其一般定义格式为:

​ <类型标识符> * <标识符>

(1)标识符前面的“*”,表示该标识符为指针变量,但“*”不是变量名的一部分。
(2)一个指针变量只能指向同一个类型的变量。

​ 1) 两个指针运算符

​ (2)运算符&:一个单目操作符,返回的是变量存储单元的地址。

​ (2) 运算符*:一个单目操作符,返回的是指针变量所指地址的内容。

​ 2)两种给指针变量赋值的方式

​ (1)定义时初始化

int a;
int *p=&a;	//定义时初始化

​ (2)利用赋值语句

int a;
int *p;
p=&a;

​ 不允许把一个整数赋予指针变量,例如:

int *p;
p=50;	//ERROR:不能将一个整型数赋值给指针变量
  • 2.指针变量的使用

    定义了指针变量后就可以使用了。

    #include <iostream>
    using namespace std;
    int main()
    {
    	int a,b;
    	b = 50;
    	int *p = &a;
    	*p = 100;	//等价于a=100
    	p = &b;		//p指向了另一个整型变量b,则*p等价于变量b
    	cout << a << endl;
    	cout << *p << endl;
    	return 0;
    }
    
    *p=&a;	//ERROR:不能将“int*”类型的值分配到int类型的实体
    
  • 3.void类型指针

    如果指针类型是void*类型,则可以与任意数据类型匹配。void指针在被使用之前,必须转换为正确的类型。

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	void * p;
    	int a = 5;
    	p = &a;								//p指向整型变量a
    	cout << "a=" << *p << endl;			//ERROR:表达式必须是指向完整类型的指针
    	cout << "a=" << *(int * )p << endl;	
    	return 0;
    }
    

    在C++中,有的头文件定义了一个常量NULL(值为0),表示不指向任何内存单元。可以把NULL常量赋给任意类型的指针变量,初始化指针变量。

    int * ptr = NULL;
    

    全局指针变量被自动初始化为NULL,局部指针变量的初值时随机的。未初始化的指针可能是一个非法的地址,导致程序运行时出现“segmentation fault”,“bus error”,“system error”等,导致程序终止运行。

  • 4.指针常量与常指针

    1)指针常量

    在定义指针变量时,指针变量前用const修饰,被定义的指针变量就是一个指针类型的常变量,指针类型的常变量简称为指针常量。

    数据类型 * const 指针变量 = 变量名;

    const修饰的是指针变量,而不是指针所指向的值。所以指针指向的值可以被更改,而指针变量的指向是不可以更改的。

    #include <iostream>
    using namespace std;
    int main()
    {
      int a, b;
      int * const p = &a;	//定义指针常量p指向a
      a = 5;
      b = 6;
      cout << *p << endl;	//输出5
      a = 7;
      cout << *p << endl; //输出7
      p = &b;					//ERROR:表达式左边必须是可修改的值
      cout << *p << endl;
      return 0;
      }	
    

    2)常指针
    在定义指针变量时,数据类型前用const修饰就定义了指向常量的指针变量,简称为常指针。
    ** const 数据类型 * 指针变量 = 变量名;**
    数据类型 const * 指针变量 = 变量名;
    == 定义一个常指针后,就不能通过常指针修改常指针所指向的值,即不能通过指针变量间接更改指针指向的值。==

      const char * p = "123456";	//定义了一个常指针
      *p = "abc";					//ERROR:试图修改指针指向的值
    

    为了避免通过一个非常指针修改常指针的值,将一个常指针赋给一个非常指针是错误的

     #include <iostream>
    using namespace std;
    int main()
    {
    int a = 5, b = 10;
    int const *p2;
    int *p1 = &a;
    p2 = p1;
    cout << "p1 = " << *p1 << endl;	//p1=5
    cout << "p2 = " << *p2 << endl;	//p2=5
    p1 = &b;
    cout << "p1 = " << *p1 << endl;	//p1=10
    cout << "p2 = " << *p2 << endl;	//p2=5	,常指针指向的值未变
    p1 = p2;	//ERROR:不能将一个常指针赋给一个非常指针
    return 0;
    }
    

    3)常指针常量
    const 数据类型 * const 指针变量 = 变量名 ;
    数据类型 const * const 指针变量 = 变量名 ;

  • 32
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在面向对象的编程中,C语言并不直接支持类和抽象的概念。引用中提到,final关键字用来修饰方法,表示该方法不能在子类中被覆盖。而abstract关键字用来修饰抽象方法,表示该方法必须在子类中被实现。然而,在C语言中,没有对应的关键字来实现类和抽象的概念。 相反,C语言通过结构体来模拟类的概念。结构体是一种用户自定义的数据类型,可以包含多个不同类型的数据成员。通过结构体,我们可以将相关的数据和功能组合在一起。然而,C语言中的结构体不支持继承和多态等面向对象的特性。 在C语言中,我们可以使用函数指针来模拟抽象类和接口的概念。函数指针可以指向不同的函数,通过使用函数指针,我们可以实现多态性,即在运行时根据函数指针指向的具体函数来执行不同的操作。 综上所述,C语言并不直接支持面向对象中的类和抽象的概念,但可以使用结构体和函数指针来实现类似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [面向对象——类和对象](https://blog.csdn.net/shouyeren_st/article/details/126210622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [面向对象编程原则(06)——依赖倒转原则](https://blog.csdn.net/lfdfhl/article/details/126673771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值