C指针之初始化(三)

一、引言

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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sunnyoldman001/article/details/128107056