c++指针的复习整理

小编 2026-06-21 阅读:433 评论:0
(一)什么是指针? 指针类型:存放内存单元地址的变量类型。 指针变量:存储地址的变量。 常将地址变量、地址、地址变量的值统称为指针。 (二)定义与使用 1、指针变量的定义 格式:        ...

(一)什么是指针?

指针类型:存放内存单元地址的变量类型。

指针变量:存储地址的变量。

常将地址变量、地址、地址变量的值统称为指针。

(二)定义与使用

1、指针变量的定义

格式:        数据类型  * 变量名;

  • 数据类型:可以是基本数据类型、构造数据类型、void类型;
  • 指着变量无论指向什么类型的对象,存的都是地址,存储空间大小均为4个字节

如:

int * ip;
float *fp;
typedef int A[10];
A *ap;

对上面的哥哥变量,有: sizeof(ip) = sizeof(fp) = sizeof(ap) = 4;

虽然存储空间都一样,但是不同类型的指针变量存不同类型的变量;

2.初始化与赋值

若指针变量既没有赋值,也没有初始化,那它存的地址是一个随机数,可能指向的内存单元中放着及其重要的数据,若对它访问可能对系统造成极大的危害。所以指针在使用之前必须有确定的指向!即赋值后再引用!

格式:    

定义时:         数据类型 * 指针变量名 = 初始地址表达式;

定义后:         指针变量名 = 地址表达式;

赋值时应注意:

1)不能将非地址常量、变量及无意义地址赋值给指针变量。

2)可用一个已初始化的地址指针给另一个指针赋值。但类型必须一致,不一致时可进行强制转换!

如:

char *p = NULL;

int * ip = (int *) p + 100;

3)void类型的指针可以存放任意的变量地址,但void类型给其他类型赋值时必须强制转换;

如:

void v ;

void *vp;

int *ip,i;

vp = &i;

vp = ip;

ip = (int *)vp;

3.指针运算

1) * 和 & 运算

*          出现在指针变量表达式前时 ,是一元运算符,表示访问指针所指向的对象;

&         在变量左边,一元运算符,表访问变量的地址。

2)加减法

表示指针向后或向前移动 n 个sizeof(数据类型) 长度的存储单元。

3)自增和自减移动

表从当前位置向后或向前sizeof(数据类型) 长度的存储单元

注意:

int  * p , * q, a = 5;

p = &a;

p++;//指针p后移4个字节;

*p++;    // 顺序即 *p, p++;

(*p)++;// 读取p指向的变量,使变量值+1;

* ++p;// 顺序即: ++p, *p;(指针后移,再取值)

++ *p;//将p指向的变量的值+1;

4)指针相减:

指向同一数组时才有意义;

表量指针间数组元素的个数;

5)两个指针的比较

一般用于下面两种情况:

一是比较两指针对象内存的位置关系;

​​​​​​二是判断是否为空指针。

(三)指针与字符串

如:

char str[5] = \"abcd\";     //str[]中的5个元素分别是:\'a\',\'b\',\'c\',\'d\',\'\\0\';

char *p_str = \"abcd\";      //p_str 的值为\'a\'的地址

1)字符数组名与字符指针名等效:

如cout << str << endl;与cout << p_str << endl;均可输出字符串

注意:

  • 字符类型以外的数组或指针,使用cout 输出的是地址,而不是字符串。

若想输出字符数组的地址与字符指针的地址,可将其强制转化为void指针,如cout << (void *)str << endl;

cout << (void *) p_str << endl;

  • 空指针与指向空串的区别;

(对空指针的引用是危险的)

char * p1 = NULL; // 空指针

char *p2 = 0;// 空指针;

char *q1 = \"\\0\";//空串!

char *q2 = \'\\0\' ; // 空指针!!!

2)可以将字符指针当字符数组使用

如*(p_str+1) 和p_str[1]等效

  • 对指针指向的字符串赋值不能简单用“=”

如:char * p = \"1234\"

char *q = \"abcd\"

q = p;// 只是将q指向p所指的地址;

可用下面的方法进行赋值:

while(*q)

{

*p++ = *q++;

*p = \'\\0\';

}

(四)指针与数组

1.使用指针操作符*存储地址

1)a[i] 等效于*(a+i)

2)b[i][j][k] 等效于 *(*(*(b+i)+j)+k)

2.指针数组

以指针变量为元素的数组

定义的格式:      类型名 * 数组名[下标表达式];

如 int * p_a[5];

typedef int * I_P;

I_P p_a[5];

char * sentence[] = { \" I\'m\",

                                   \"a,Chinese\"

                                  }

(可采用二位数组的方式存取)

3.数组指针

指向数组的指针

定义的格式:    类型名 ( * 指针名)[下标表达式];

如:

int (*a_p)[5];

 

typedef int I_A[5];

I_A *a_p;

 

注意类型匹配

int a[5];

a_p = &a;

4.多重指针

定义格式:        类型名 * * 变量名

(二级指针)

如: int ** p

等价于 :

typedef int *P;

P *p;

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表