• 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果:
    在这里插入图片描述
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    上述代码是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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    运行结果:
    在这里插入图片描述
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果:
    在这里插入图片描述
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果:
    在这里插入图片描述
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

  • 相关阅读:
    (01)ORB-SLAM2源码无死角解析-(57) 闭环线程→计算Sim3:理论推导(1)求解R,使用四元数
    卷积神经网络笔记2
    Java:比较两个字符串是否相等
    Elasticsearch 如何设计表结构
    HTTP/2的三大改进:头部压缩、多路复用和服务器推送
    接口测试常用工具及测试方法(零基础篇)
    C++ | Leetcode C++题解之第91题解码方法
    vue3中ref和reactive的区别
    Java版Word开发工具Aspose.Words基础教程:创建或加载文档
    Ubuntu Linux 24.04 安装apache web server操作记录
  • 原文地址:https://blog.csdn.net/sunnyoldman001/article/details/128107056