一、引言
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;
}