C/C++中利用空指针(NULL),提高程序运行效率
“阿巴喇叭”通过精心收集,向本站投稿了9篇C/C++中利用空指针(NULL),提高程序运行效率,下面是小编帮大家整理后的C/C++中利用空指针(NULL),提高程序运行效率,希望对大家有所帮助。
篇1:C/C++中利用空指针(NULL),提高程序运行效率
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要,请务必著名出处和作者
#include
#include
using namespace std;
void print_char(char* array[]);//函数原形声明
void main(void)
{
char* test[]={“abc”,“cde”,“fgh”,NULL};//这里添加一个NULL,表示不指向任何地址,值为0
print_char(test);
cin.get;
}
void print_char(char* array[])
{
while(*array!=NULL)
{
cout<<*array++<
}
}
这里的写法,可以避免使用for循环,减少栈空间内存的使用和减少运行时的计算开销!
篇2:c中指针指针、指针的指针、指针数组和数组指针
一、指针
如果在程序中定义一个变量,在对程序进行编译,系统会自动给这个变量分配内存单元,根据不同的类型,分配不同长度的空间,如int占用4个字节,char占用1个字节,内存单元中每个字节都有编号,这就是地址。由于可通过地址能够找到所需的变量单元,可以说地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号301,这个301就是房间的地址,将该地址形象化为指针。对于一个内存单元来说,单元的地址(编号)即为指针,其中存放的数据才是该单元的内容。
严格地说,一个指针是一个地址,是一个常量,
而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。
例如:
int a=12;
int *p=&a;
二、指针的指针(二级指针)
简单来说,二级指针变量就是一级指针变量的地址。
例如:
int a=12;
int *p=&a;
int **=&p;
篇3:C盘提高电脑运行速度
1.打开“我的电脑”-“工具”-“文件夹选项”-“查看”-在“显示所有文件和文件夹”选项前打勾-“确定”
2、关闭远程桌面:“我的电脑”->“属性”->“远程”,“远程桌面”里的“允许用户远程连接到这台计算机”勾去掉,
3.如果对系统进行过windoes updade升级,则删除以下文件:x:\windows\下以 $u... 开头的隐藏文件
4.然后对磁盘进行碎片整理,整理过程中请退出一切正在运行的程序
5.碎片整理后打开“开始”-“程序”-“附件”-“系统工具”-“系统还原”-“创建一个还原点”(最好以当时的日期作为还原点的名字)
6.打开“我的电脑”-右键点系统盘-“属性”-“磁盘清理”-“其他选项”-单击系统还原一栏里的“清理”-选择“是”-ok了
7、删掉\windows\system32\dllcache下dll档(减去200——300mb),这是备用的dll档, 只要你已拷贝了安装文件,完全可以这样做,
篇4:c/c++中的指针的应用及注意问题
指针是c/c++学习一个比较让人头痛的问题,在程序设计过程中,指针也往往是产生隐含bug的原因,下面就来
谈谈指针的应用以及需要注意的一些问题,里面也许就有你平时没有注意到的问题,希望能帮助各位读者理解好指针。
一、我们先来回忆一下指针的概念吧,方便下面的介绍
指针是存放地址值的变量或者常量。例如:int a=1;&a就表示指针常量(“&”表示
取地址运算符,也即引用)。int *b,b表示的是指针变量(注意,是b表示指针变量而
不是*b),*表示要说明的是指针变量。大家注意int *b[2]和int(*b)[2]是不同的,
int *b表示一个指针数组,而int (*b)[2]表示含有两个元素的int指针,这里要注意
运算优先级问题,有助于理解指针问题。
在这里大概介绍基本概念就够了,至于具体使用方法,如赋值等,很多书都有介绍
,我就不多说了。
二、应用以及注意的问题
1、理解指针的关键所在——对指针类型和指针所指向的类型的理解
①、指针类型:可以把指针名字去掉,剩下的就是这个指针
例如:int *a;//指针类型为int *
int **a;//指针类型为int **
int *(*a)[8];//指针类型为 int *(*)[8]
②、指针所指向的类型:是指编译器将把那一片内存所看待成的类型。这里只要把
指针声明语句中的指针名字和名字右边的“*”号去掉就可以了,剩下的就是指针所指向
的类型。
我之所以把他们放在第一位,是因为弄清楚他们是学c/c++指针的重点,正确理解他
们才能使你打好c/c++的编程基础。
2、指针的应用——传递参数。
其实它可以相当于隐式的返回值,这就比return的方法更加灵活了,可以返回更多
的值,看看下面的例子自然就明白了:
#include “iostream.h”
void example(int *a1,int &b1,int c1)
{
*a1*=3;
++b1;
++c1;
}
void main
{
int *a;
int b,c;
*a=6;
b=7;c=10;
example(a,b,c);
cout 《“*a=”《*a<
cout 《“b=”<
cout 《“c=”<
}
输出:*a=18
b=8
c=10
注意到没有,*a和b的值都改变了,而c没有变,
这是由于a1是指向*a(=6)的指针
,也即与a是指向同一个地址,所以当a1指向的值改变了,*a的值也就改变了。在函数中
的参数使用了引用(int &b1),b1是b的别名,也可以把它当作特殊的指针来理解,所
以b的值会改变。函数中的参数int c1只是在函数中起作用,当函数结束时候便消失了,
所以在main()中不起作用。
3、关于全局变量和局部变量的一个问题
先不废话了,先看看程序:
#include “iostream.h”
int a=5;
int *example1(int b)
{
a+=b;
return &a;
}
int *example2(int b)
{
int c=5;
b+=c;
return &b;
}
void main()
{
int *a1=example1(10);
int *b1=example2(10);
cout 《”a1=”《*a1<
cout 《”b1=”《*b1<
}
输出结果:
a1=15
b1=4135
*b1怎么会是4135,而不是15呢?是程序的问题?没错吧?
由于a是全局变量,存放在全局变量的内存区,它一直是存在的;而局部变量则是存
在于函数的栈区,当函数example2()调用结束后便消失,是b指向了一个不确定的区域
,产生指针悬挂。
下面是对example1()和example2()的反汇编(用TC++ 3.0编译):
example1():
push bp;入栈
mov bp,sp
mov ax,[bp+04];传递参数
add [00AA],ax;相加
mov ax,00AA ;返回了结果所在的地址
.
.
.
pop bp;恢复栈,出栈
篇5:c/c++中的字符指针数组,指向指针的指针的含义
就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针!
先看下面的代码,注意看代码中的注解!
#include
#include
usingnamespacestd;
voidprint_char(char* array[],intlen);//函数原形声明
voidmain(void)
{
//-----------------------------段1-----------------------------------------
char*a[]={“abc”,“cde”,“fgh”};//字符指针数组
char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\0字符串的首地址
cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)/-------------------------------------------------------------------------
//-----------------------------段2-----------------------------------------
char* test[]={“abc”,“cde”,“fgh”};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上)
intnum=sizeof(test)/sizeof(char*);//计算字符串个数
print_char(test,num);
cin.get;
//-------------------------------------------------------------------------
}
voidprint_char(char* array[],intlen)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度
{
for(inti=0;i{
cout<<*array++<}
}
下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:
char*a[]={“abc”,“cde”,“fgh”};
char* *b=a;
cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)<
char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)<结果是>结果是>
abc
cde
fgh
可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\0后停止.
我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<
到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧!
420){this.width=420}“ alt=”“ />
内存结构示意图!
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要,请务必著名出处和作者
篇6:c/c++中指针学习的两个绝好的例子
对于众多人提出的c/c++中指针难学的问题做个总结:
指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*指针运算符的作用,假设定义了一个指针变量x,*x所表示的其实就是变量a本身,x表示的是变量a在内存中的地址,如果想明白可以输出观察cout < <*x”|“x;,当定义了int *x;后对x=&a的理解的问题,仔细阅读和联系下面的两个例子我想指针问题就不是难点了!
/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
main()
{
int a,b; /* 定义a,b两个整形变量用于输入两个整数 */
int *point_1,*point_2,*temp_point; /* 定义三个指针变量 */
scanf(”%d,%d“,&a,&b); /* 格式化输入a,b的值 */
point_1=&a; /* 把指针变量point_1的值指向变量a的地址 */
point_2=&b; /* 把指针变量point_2的值指向变量b的地址 */
if (a
{
temp_point=point_1; /* 这里的temp_point是用于临时存储point_1的值也就是变量a的地址的 */
point_1=point_2; /* 把point_2的值赋予point_1 */
point_2=temp_point;
/* 由于point_1的值已经改变无法找到,利用前面临时存储的也就是temp_point找回原point_1的值赋予point_2,打到把point_1和point_2值对换的目的*/
}
printf(”%d,%d“,*point_1,*point_2); /* 利用*point_1和*point_2也就是分辨指向b和a的方法把值显示自爱屏幕上 */
}
/* 此题需要注意和了解是的此法并没有改变变量a,b的值只是利用指针变量分别存储a和b的地址,然后再把那两个指针变量的值对换一下其实就是存储在
指针变量里面a与b的地址对换,在利用*point_1和*point_2的方式把调换后的值显示出来这里的*point_1实际就是a,此中算法并非真的改变a,b的值,而是
利用指针进行地址交换达到大小排序的目的.
*/
/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
main()
{
int a,b; /* 定义a,b两个整形变量用于输入两个整数 */
int *point_1,*point_2; /* 定义三个指针变量 */
scanf(”%d,%d“,&a,&b); /* 格式化输入a,b的值 */
point_1 = &a; /* 把指针变量point_1的值指向变量a的地址 */
point_2 = &b; /* 把指针变量point_2的值指向变量b的地址 */
compositor(point_1,point_2); /* 调用自定义的排序涵数,把a,b的地址传递给point_1和point_2 */
printf(”%d,%d“,a,b); /* 打印出a,b的值 */
}
static compositor(p1,p2)
int *p1,*p2; /* 定义形式参数p1,p2为指针变量 */
{
int temp; /* 建立临时存储变量 */
if (*p1<*p2) /* 如果*p1
{
temp = *p1; /* 利用变量temp用于临时存储*p1和就是a的值 */
*p1 = *p2; /* 将*p1的值也就是a的值换成*p2的值也就是b的值,等价于a=b */
*p2 = temp; /* 将*p2的值也就是temp的值等价于b=temp */
}
}
/* 注意:此题与上题不同的是,直接改变了a于b的值达到真实改变的目的 */
希望大家指正批评!
篇7:C/C++中数组和指针类型的关系的入门教程
对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指针特性的知识!
一个整数类型数组如下进行定义
int a[]={1,2,3,4};
如果简单写成
a;//数组的标识符名称
这将代表的是数组第一个元素的内存地址,a;就相当于&a[0],它的类型是数组元素类型的指针,在这个例子中它的类型就是int*
如果我们想访问第二个元素的地址我们可以写成如下的两种方式!
&a[1];
a+1//注意这里的表示就是将a数组的起始地址向后进一位,移动到第二个元素的地址上也就是a[0]到a[1]的过程!
数组名称和指针的关系其实很简单,其实数组名称代表的是数组的第一个元素的内存地址,这和指针的道理是相似的!
下面我们来看一个完整的例子,利用指针来实现对数组元素的循环遍历访问!
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要,请务必著名出处和作者
#include
using namespace std;
void main(void)
{
int a[2]={1,2};
int *pb=a; //定义指针*pb的地址为数组a的开始地址
int *pe=a+2; //定义指针*pb的地址为数组a的结束地址
cout << a << ”|“ << a[0] << ”|“ << *(a+1) << ”|“ << pb << ”|“ << *pb <
while (pb!=pe) //利用地址进行逻辑判断是否到达数组的结束地址
{
cout << *pb << endl;
pb++; //利用递增操作在循环中将pb的内存地址不断向后递增
}
cin.get;
}
篇8:翻译教学中如何利用互联网提高翻译效率
翻译教学中如何利用互联网提高翻译效率
随着计算机技术和信息技术的发展,计算机和网络变成了信息的新的'载体.通过计算机网络检索,我们可以迅速查询到所需的翻译信息,极大地提高翻译的速度.通过对比基于字典的传统翻译信息查询方式和基于计算机网络的现代翻译信息查询方式,结合具体实例分析介绍了几种常用的网络翻译工具及其特点,旨在提高学生利用网络搜索提高翻译的速度与质量.
作 者:梁金柱 贾丽萍 郑秀艳 LIANG Jin-zhu JIA Li-ping ZHENG Xiu-yan 作者单位:成都纺织高等专科学校经贸与外语系,成都,611731 刊 名:成都纺织高等专科学校学报 英文刊名:JOURNAL OF CHENGDU TEXTILE COLLEGE 年,卷(期): 25(3) 分类号:H315.9 关键词:汉英翻译 互联网 搜索引擎 网络翻译工具篇9:C/C++中多维数组的指针作为函数参数传递
/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
main()
{
void search_score(); /* 定义自定义涵数类型为不返回型 */
void count_avg(); /* 定义自定义涵数类型为不返回型 */
static float a[3][4]={{97,45.5,66,77},{88,92.5,78.5,66},{83,74.5,92,100}}; /* 输入3个学生的各自4门课的成绩 */
search_score(a,0); /* 调换自定义涵数显示其中一个同学的各门课成绩 */
count_avg(*a,12); /* 调换自定义涵数显示3个同学各门课的平均成绩成绩 */
/* 注意上面的*a其实也就是a[0]或者是&a[0][]0将这行改写成count_avg(a[0],12);或者count_avg(&a[0][0],12)也都是对的 */
}
void search_score(p,n)
float (*p)[4]; /* 定义一个指针变量p,说明它是一个指向一个包含4个整型变量一维数组的指针 */
int n; /* 定义形式参数n为整形 */
{
int i; /* 定义用于循环的变量i */
for (i=0;i<4;i++ ) /* 这里循环4次用于打印一个同学的4门课成绩 */
{
printf(”%7.2f“,*(*(p+n)+i));
}
printf(”\n“);
}
void count_avg(p,n)
float *p;
int n;
{
float *p_end;
float sum = 0;
float avg;
p_end = p+n-1; /* 计算出最后一个数组元素的地址 */
for (;p<=p_end;p++) /* 循环到最后一个元素地址就停止 */
{
sum += *p;
}
avg = sum/n;
printf(”avg=%7.2f\n",avg);
}
/*
注意此题的意思在于输入3个同4门课的成绩,计算出平均值和显示其中一个同学的4门课成绩,此例是对多维数组指针和多维数组
的指针作为涵数参数传递的总结,认真联系和体会可以很好的了解多维数组指针的概念到底是什么!
*/
【C/C++中利用空指针(NULL),提高程序运行效率】相关文章:






文档为doc格式