C++/C语言指针概述

所谓指针,其实就是地址,那么为什么会有这个东西呢?其实我们输入的变量都是会存储在计算机的内存中的,为了方便一些操作,我们可以通过访问它们的地址来进行一些操作

局部变量和全局变量存放的地址有所不同,局部变量存在栈区,展区向低地址扩展,全局变量则存在堆区,堆区则向高地址扩展,同时,栈区由系统自动分配,速度快,但程序无法控制,这就是为什么局部变量要初始化,全局变量不用初始化

接下来说说指针变量的误区

int *p=&a;

*p=2;

这两者看着差不多,但含义不一样,*p=2的*是类似于引用符号一样,它使用的前提是p是指针变量,然后p表示的是一个地址,*是解引用操作符,表示该地址具体的值、

而int* p则是说明p是一个指针变量

接下来讲讲数组

数组名作为一个数组的首地址,可以通过加法来查看后面元素的地址(顺序),也可以来访问数组的元素 比如int a[ ]={2,4,5},cout<<*(a+1)的结果是4 cout<<a+1 是a下标为1元素的地址

但是,有个特殊的例子 char 类型的数组,输出char类型数组的地址要强制类型转换,例如:cout<<(void*)p;单单输出p的话会报错,然后c++有个比较方便的写法int& p=a;这里的p相当于是a的小名,表示的是a

现在讲讲结构体

我们现在有如下的结构体

struct node{

        int val;

        node* next;

        node(int _val):val(_val),next(NULL){}//初始化结构体来初始化成员变量

};

现在有两种方式来引用成员变量

1.如果是这样定义node* p=new node(1);或者auto p=new node(1);

这说明了p是地址,那么可以用p->next=p//也就是用->来定义

2.node a = node(1);

那么可以这样进行调用a.next=...;

接下来我们试着创建一个链表来加深对指针的印象

#include<iostream>
using namespace std;
struct node{
        int val;
        node* next;
        node(int _val):val(_val),next(NULL){}//初始化结构体来初始化成员变量
};
int main(){
	node* x=new node(1);
	node* y=new node(2);
	node* z=new node(3);
	x->next=y;
	y->next=z;
	node* head=x;
	for(node* i=head;i;i=i->next)cout<<i->val<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值