指针使用小结 -- 指针传递与指针所指空间赋值

结合示例 总结一下 指针的各个概念及指针变量在函数中的传递与应用

如 

int a = 3; 

int* point =&a;

设内存分布如下

address 变量名
0x300000a3
..  
..  
0x500000point0x300000
   

指针变量(用于存储其他变量的空间地址)point (0x300000),指针变量的存储地址(指针变量自身的地址)&point  (0x500000),指针的指向存储空间的值 *point  ( 3)


示例:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>


typedef int* Triplet;

void swap(int* a, int* b);
int InitArray(int* arr, int a, int b, int c);
int InitTriplet(Triplet* T, int a, int b, int c);
int TestPointAssign(Triplet T, int a, int b, int c);


int main()
{
	int m = 2, n = 4;
	int Array[] = {1, 2, 3};
	Triplet T_num = NULL;

	swap(&m, &n);
	printf("m = %d, n = %d\n", m, n);

	//为已分配空间(指针指向/数组)赋值
	InitArray(Array, 11, 12, 13);
	printf("A[0] = %d, A[1] = %d, A[2] = %d\n", Array[0], Array[1], Array[2]);
	
	//指针变量T_num的值(指向的地址)与自身地址
	printf("before test:T_num:%d, &T_num:%d\n", T_num,  &T_num);
	TestPointAssign(T_num, 111, 112, 113);
	
	//指针变量T_num的值(指向的地址)与自身地址
	printf("after test:T_num:%d, &T_num:%d\n", T_num,  &T_num);

	//指针指针指向新地址之前的地址 (此处 NULL--0000)
	//printf("address before resign:%d\n",T_num);

	//使指针指向新地址,在新地址处为其分配所指定大小的存储空间
	InitTriplet(&T_num, 1, 2, 3);
	//T_num存储指针指向新地址之后的地址 (即连续3个存储空间的首地址)
	printf("after resign:T_num:%d, *T_num:%d, &T_num:%d\n", T_num, *T_num, &T_num);
	printf("Init point:T_num[0] = %d, T_num[1] = %d, T_num[2] = %d\n", T_num[0], T_num[1], T_num[2]);

	return 0;
}

void swap(int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}

int InitArray(int* arr, int a, int b, int c)
{
	arr[0] = a;
	arr[1] = b;
	arr[2] = c;

	return 0;
}

int InitTriplet(Triplet* T, int a, int b, int c)
{
	*T = (int*)malloc(sizeof(int) * 3);
	if ( !(*T) )
	{
		printf("overflow");
		exit(0);
	}
	(*T)[0] = a;
	(*T)[1] = b;
	(*T)[2] = c;

	return 0;
}

int TestPointAssign(Triplet T, int a, int b, int c)
{
	T = (int*)malloc(sizeof(int) * 3);
	if ( !T )
	{
		printf("overflow");
		exit(0);
	}
	T[0] = a;
	T[1] = b;
	T[2] = c;
	printf("In function 0~2: %d, %d, %d\n", T[0], T[1], T[2]);
	printf("In function test address:%d\n",T);

	return 0;
}


运行结果:


分析:
int* p_num = NULL; //定义指针变量 p_num, 并初始化 使其 指向NULL(0000地址)
即p_numm 为其指向的地址(0x000000)
*p_num 为 指向地址所储存值。 (0x000000 存储数据不可访问)
&p_num 为 指针变量p_num 自身所在的存储空间。 (假设此处为 0x300000 )
 
p_num = (int*) malloc(sizeof(int) * 3);
p_num 指向一个新的地址存储空间 (假设为 0x500000)
*p_num 为 指向地址所储存值。 (0x500000 中存储的数据)
&p_num 为 指针变量p_num 自身所在的存储空间。 (为 0x300000 与上述一致,保持不变。即指针变量p_num自身的存储空间没变,只是其所指向的存储空间变了。 由原来指向的0x000000空间,变为由3个int构成的连续空间的首地址(低位地址)0x500000
 
对比
int InitTriplet(Triplet * T, int a, int b, int c);
int TestPointAssign(Triplet T, int a, int b, int c);
前者传递的是指针变量T的指针(地址),后者传递的是指针变量

如同swap()函数的作用,如要在函数内 改变传递变量的值--将其带回,需要传递变量的地址,在所在地址处修改变量的值;而非传递一变量。后者 将 实参 T_num 的值传递函数,函数内部 T_num 将值赋值给另一存储空间(变量)T,修改的是变量T--test adress假设为 0x533245,而非变量T_num--须将T_num的地址传递到函数内部。
 
 
int InitArray( int * arr, int a, int b, int c);
int array[3] = {0};
int* point_t = NULL;
 
InitArray(array, 1, 2, 3);//ok -- arr为一数组名,有固定的存储空间。在空间地址内赋值即可
InitArray(point_t, 1, 2, 3);//error -- point_t为一指针,需为其所指向地址分配空间,才可赋值
 

指针与引用
C++中 可以用 引用 来实现下函数
int InitTriplet(Triplet* T, int a, int b, int c)  //指针传递
{
    *T = (int*)malloc(sizeof(int) * 3);
    if ( !(*T) )
    {
        printf("overflow");
        exit(0);
    }
    (*T)[0] = a;
    (*T)[1] = b;
    (*T)[2] = c;
 
    return 0;
}
调用    InitTriplet(&T, 1, 2, 3);

 
int InitTriplet(Triplet& T, int a, int b, int c)  //使用
{
    T = (int*)malloc(sizeof(int) * 3);
    if ( !T )
    {
        printf("overflow");
        exit(0);
    }
    T[0] = a;
    T[1] = b;
    T[2] = c;
 
    return 0;
}
调用   InitTriplet(T, 1, 2,3);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值