##################指针的一般操作###############
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
#include <iostream>
using namespace std;
int main(){
int p[] = {1,2,3,4,5};
int i = 101;
int *poi1,*poi2;
cout << &p << endl;
cout << &i << endl;
poi1 = p;
poi2 = &i;
cout << poi1 << endl;
cout << *poi1 << endl;//默认是数组第一个元素地址
cout << *poi2 << endl;
cout << poi2 << endl;
}
###############空指针####################
在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
如需检查一个空指针,您可以使用 if 语句,如下所示:
if(ptr) /* 如果 ptr 非空,则完成 */
if(!ptr) /* 如果 ptr 为空,则完成 */
#include <iostream>
using namespace std;
int main(){
int *p = NULL;
cout << p;
return 0;
}
################指针的算术运算##############
指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。
假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:
ptr++
在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。
#include <iostream>
using namespace std;
int main(){
int *p;
int arr[] = {22,33,44};
p = arr;
for(int i=0;i<3;i++){
cout << i << '-' << p << endl;
cout << i << '-' << *p << endl;
p++;
//数组是常量指针 do not arr++
}
}
#include <iostream>
using namespace std;
const int MAX = 3;
int main(){
int *p;
int arr[] = {22,33,44};
p = &arr[MAX-1];
for(int i=0;i<MAX;i++){
cout << i << '-' << p << endl;
cout << i << '-' << *p << endl;
p--;
//数组是常量指针 do not arr++
}
}
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
for (int i = 0; i < MAX; i++)
{
*var = i; // 这是正确的语法
var++; // 这是不正确的
}
return 0;
}
把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值。
由于一个数组名对应一个指针常量,只要不改变数组的值,仍然可以用指针形式的表达式。例如,下面是一个有效的语句,把 var[2] 赋值为 500:
*(var + 2) = 500;
上面的语句是有效的,且能成功编译,因为 var 未改变。
您也可以用一个指向字符的指针数组来存储一个字符串列表,如下:
实例
#include <iostream>
using namespace std;
const int MAX = 4;
int main ()
{
const char *names[MAX] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
for (int i = 0; i < MAX; i++)
{
cout << "Value of names[" << i << "] = ";
cout << names[i] << endl;
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
- 关于我
- laravel
- quickstart
- quickstart-intermediate
- swoole
- (一)快速起步
- php7
- swoole异步高性能
- 开发中常见问题
- event扩展的安装
- phptrace
- 用C/C++写php扩展
- 无聊的笔试题
- rewrite二级目录转二级域名
- php多进程
- rpc-yar
- php专家列表
- php守护进程
- php函数防止超时
- php分析报错信息
- gdb调试php
- php-cli模式
- composer/pear
- 基础
- sublime+xdebug
- 开启opcache
- 前端
- js
- linux
- Xshell连接不上Ubuntu解决方式
- xshell
- centos安装中文输入
- centos下安装谷歌浏览器
- centos安装phpstorm
- php7之phpredis安装
- 磁盘大小
- dns
- TCP/IP协议
- HTTP
- tcpdump
- zbacktrace
- gdb调试php扩展
- lsof
- perf
- lnmp
- first
- 重定向
- echo
- 键盘高效操作
- 权限控制
- 进程
- 环境变量
- vi
- 软件包管理
- 网络
- 查找文件
- 压缩
- 正则
- sed/awk
- 编译程序
- shell脚本
- shell认识
- sh脚本
- sh调试相关
- win共享文件夹给虚拟机
- git
- git的安装
- 常用命令
- 本地到远程仓库
- 远程到本地仓库
- 分支管理
- bug分支
- feature
- 标签
- 多人协作
- FAQ
- C/C++
- 难点
- 修饰符
- 数组
- 字符串
- 指针
- 引用
- 面向对象
- 类访问修饰符
- 构造函数
- 操作文件
- mysql集群
- 使用navicat操作MySQL数据库能不能整个数据库搜索一条数据?
- 帮助的使用
- 存储引擎的选择
- 数据类型/字符集
- 索引
- kafka集群
- rabbitmq集群
- (一)初识rabbitmq
- (二)原理
- (三)消息模型
- (四)rabbitmq&php基础
- (五)持久化&route&指定exchange
- (六)发布订阅
- (七)route key
- (八)topic
- elasticsearch集群
- (一)服务端搭建
- (二)elasticsearch&php
- (三)head插件
- redis集群
- github
- 设计模式
- createType
- factory_method.php
- abstract_factory.php
- mysql_singleton.php
- builder.php
- prototype.php
- structType
- adapter.php
- 数据结构与算法
- python