一、引言

C/C++语言中引入了指针,使得程序能够直接访问内存地址,使得很多复杂的操作变得简单,同时也提高了程序的运行效率。指针即是地址,但是地址却是通过指针变量来存储的。因此我们通常所说的指针在很多时候说的都是指针变量。指针变量在使用之前必须被初始化,否则就可能发生意想不到的错误。而且关于指针初始化,不同的编译器给出的告警是不一样的,有些系统给出告警,而有些系统又不给。因此,指针虽然,但使用要谨慎。而且要是使用了动态分配空间的模式为指针做初始化,则使用结束后还需要手工释放空间,以节约内存空间。本文以C语言为主介绍了常见的指针变量初始化方法。

二、指针变量初始化范例

1.指向某个变量的地址
示例代码:

#include"stdio.h"
int main()
{int a = 1;int *p = &a;//指针变量初始化 printf( " 存储变量a的地址:%x\n", &a );printf( " 指针变量p存储的地址:%x\n", p );printf( " 指针变量p指向地址中的数据:%5d\n", *p );return 0;
}

运行结果:

2.动态分配空间
通常用于动态数组,C语言使用malloc进行动态分配空间,C++使用new分配空间。动态数组使用结束需要释放空间,使用free或者delete进行释放。
示例代码:

#include"stdio.h"
#include"malloc.h"
int main()
{int i, num, sum, count;int *arr;count = 0;while( 1 ){sum = 0;num = 0;printf( "数组元素的个数(0 结束):" );scanf( "%d", &num );if( num == 0 ){printf( "结束运行!\n" );break;}count++;arr = ( int * )malloc( num * sizeof( int ) );//动态分配空间for( i=0; i<num; i++ ){printf( "输入第 %d 个元素:", i+1 );scanf( "%d", &arr[i] );sum += arr[i];}printf( "第 %d 组元素之和:%5d\n", count, sum );}free( arr );//释放由malloc分配的空间 return 0;
}

上述代码是C语言,如果使用C++语言,则是如下代码:

#include"iostream"
using namespace std;
int main()
{int i, num, sum, count;int *arr;count = 0;while( 1 ){sum = 0;num = 0;cout<< "数组元素的个数(0 结束):";cin>>num;if( num == 0 ){cout<<"结束运行!"<<endl;break;}count++;arr = new int[num];//使用new分配空间for( i=0; i<num; i++ ){cout<<"输入第 " <<(i+1) << " 个元素:";cin>>arr[i];sum += arr[i];}cout<<"第 " << count <<" 组元素之和:" <<  sum << endl;}delete[] arr;//释放由new分配的空间 return 0;
}

运行结果:

3.指向某个数组的首地址
通常用于快速对数组元素做相应的操作,例如利用指针变量p++模式对数组赋值或者读取元素,其读取内存速度快。
示例代码:

#include"stdio.h"
#define N 10
int main()
{int i, arr[N], *p;p = arr; //p = &arr[0]; //指针变量p指向数组的首地址,此处有两种不同的赋值方法i = 1;while( i <= N ){printf( "输入第 %d 个元素: ", i );scanf( "%d", p++ );i++;}printf( "数组arr中的元素:" );for( i=0; i<N; i++ ){printf( "%5d", arr[i] );}return 0;
}

运行结果:

4.指向字符串变量或字符串常量
通常用于快速对字符串做相应的操作。
示例代码:

#include"stdio.h"
#include"string.h"
int main()
{char *pc;                    //pc = "c language";//如此初始化指针会发生告警char str[] = "C/C++ Programming language";pc = str; printf( "%s\n", pc ); pc = pc + 2;           printf( "%s\n", pc ); char *p = strstr( pc, "lan" );//找到 "lan"在pc中位置地址,赋值为指针变量p printf( "%s\n", p );return 0;
}

运行结果:

5.利用其它指针做初始化
通常用于缓存某一地址。
示例代码:

#include"stdio.h"
#include"malloc.h"
int main()
{int i, *p, *q;int num = 5;p = ( int * )malloc( num * sizeof(int) );//动态分配空间q = p;//q指向p的地址,这样当q的位置发生改变时,p的首地址不变i = 1;while( i <= num ){printf( "输入第 %d 个元素: ", i );scanf( "%d", q++ );//利用指针变量q偏移来对动态数组p赋值i++;}printf( "数组arr中的元素:" );for( i=0; i<num; i++ ){printf( "%5d", p[i] );}return 0;
}

C指针之初始化(三)相关推荐

  1. 野指针出现的三种情况

    昨天面试被问到"你了解野指针吗",我的回答是"野指针就是没有初始化的指针,这样的指针会随机指向一块内存,野指针会对系统造成破坏(造成内存泄漏)".面试官又问到, ...

  2. C语言中指针的初始化和赋值

    1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空).此时,*p只是表示定 ...

  3. C/C++中野指针产生的三种情况

    C/C++中野指针产生的三种情况 1.指针变量未初始化: 任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气,此时若未初始化,则产生野指针. 2.指针释放后未置空: 有时 ...

  4. C语言基础---指针数组----初始化方式常量指针数组、指针常量数组

    文章目录 1.方式一:变量的地址放入数组中 2.方式二:字符赋值 3.方式三:字符串赋值 4.为什么指针不能修改字符串.可以修改字符数组?? 5.常量指针数组----三点注意 6.指针常量数组---- ...

  5. C语言指针的初始化和赋值

    1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空).此时,*p只是表示定 ...

  6. 单链表-逆置单链表(修改指针指向且三个指针)

    题意: 采用带头结点的单链表,设计一个算法将其就地逆置,所谓"就地"是指辅助空间O(1). 这里可以有两种方法做: 1.头插法且双指针 2.改变指针指向且三指针 两方法共同点: 头 ...

  7. linux 从不兼容的指针类型,警告:从不兼容的指针类型初始化

    大家好,我已经触摸C了,所以我真的生锈了.我写了一个小程序来创建一个使用两个动态数组的矩阵.但是,我收到这个警告,我不明白为什么?我想我不太清楚指向指针的指针.有人能帮我指出我的问题在哪里吗?谢谢.警 ...

  8. php语言指针的初始化定义,指针变量的初始化,C语言指针变量初始化详解

    本节来解决如何给一个指针变量初始化.即怎样使一个指针变量指向另一个变量. 前面章节中的某些程序实际上已经使用了,即可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量.比如: int ...

  9. #十二、编写三角形类Triangle,初始化三个属性,分别是三条边的长度,定义一个计算并打印周长的函数 #十三、编写等腰三角形类EWtriangle,继承于三角形类,初始化只用传一个腰长和一个底长,定

    #十二.编写三角形类Triangle,初始化三个属性,分别是三条边的长度,定义一个计算并打印周长的函数 #十三.编写等腰三角形类EWtriangle,继承于三角形类,初始化只用传一个腰长和一个底长,定 ...

最新文章

  1. Pytorch 多 GPU 并行处理机制
  2. grails日志系统的研究
  3. S2系统相关-uptime命令总结(S代表系统相关)
  4. 统计空格流程图、火车组成jackson图
  5. 颜水成团队开源VOLO:无需额外数据,首次在ImageNet上达到87.1%的精度
  6. 百万年薪挖了个P8程序员,难道是“水货”?
  7. 仓位 001 998 AUFNAHME不存在(L9009)
  8. ehshig蒙文歌曲_ehshig蒙古音乐盒2017下载
  9. 关于textarea包在div的自适应问题
  10. c++ 连续图片显示_计算整数的和并显示结果
  11. 清零 css,css样式清零及常用类
  12. php视频文件设置期限,如何使用PHP检测视频文件持续时间(以分钟为单位)?
  13. java怎么调用另一个类的方法_Java设计模式:十篇,代码小白必看
  14. axios 上传文件 封装_axios 封装上传文件的请求方法
  15. gom引擎没有和账号服务器连接,GOM引擎和GEE引擎的传奇版本配置登录界面黑屏的原因和解决办法...
  16. 【STM32】Fault 类异常_记一次STM32中HardFault问题的调试解决
  17. Python处理视频实现特效案例十二则
  18. 微信小程序案例php,微信小程序实现删除处理的案例
  19. 百里挑一,4款免费又实用的软件,用一次就爱上
  20. Android使用Service播放音乐

热门文章

  1. 电信光猫获取超级管理员密码
  2. JAVA网络编程、正则表达式
  3. 【备份】git命令行
  4. upsert----非标准DML语句
  5. javase-Calendar
  6. CruiseControl.Net学习记录
  7. SOA系列之 什么是SOA?
  8. HTK 安装、编译以及测试——Ubuntu 14.04
  9. 射频卡读写原理及实现
  10. 图片验证码、阿里云短信发送和验证的逻辑