双指针的使用与函数返回数组

昨天做题的时候遇到一道题目,涉及到双指针和函数返回数组的问题,困惑了很久。今天查了下资料,大概明白了。
双指针就是指向指针的指针,我们都清楚,指针是指向地址,以数字为例。
    int a = 2;
    int *b;
    b = &a;

那么很明显*b = 2;由于指针也是有地址的,它不是凭空存在的,所以,如果我们取双指针,那么双指针一定是指向一个地址的地址。

int a = 2;
int *b;
b = &a;
int **c;
c = &b;
如果我们此时对c进行操作,那么就是决定它还是不是指向b,这样解释其实不是很好懂,让我们用一个应用来更好地理解双指针。
#include<stdio.h>
void main()
{
    int a = 6;
    int *b;
    int **c;
    b = &a;
    c = &b;
    printf ("%d\n", a);
    printf ("%d\n", &a);
    printf ("%d\n", b);
    printf ("%d\n", &b);
    printf ("%d\n", c);
}

关于双指针用于二维数组,一个二维数组a[i][j];通过双指针表示int** c; *((c + i)+j)来表示这样的表示方式比较直观,但是不管是几级指针,都是不可能改变指向地址的值(看到有的回答说通过二级指针可以改变一级指针指向的地址)。
关于函数返回数组的问题,函数返回不了一整个数组,因为数组是一种数据结构,不是一种数据类型,但是我们可以通过返回数组的数组名进而实现数组的返回,由于数组名就是数组的首地址,所以这里分为两种一种是静态的返回,就是先前已经创建了一个数组用来接收返回的首地址,但是,容易犯一个错误:

//错误代码
#include<stdio.h>
double *copy1(double array[],double c1[],int n)
{
int i;
for(i=0;i<n;i++)
c1[i]=array[i];
return c1;
}

void main()
{
int size=4;
double source[4]={1,2.3,4};
double first_copy[4];
double *fp;
first_copy=copy1(source,first_copy,size);
printf("The first copy: %f,%f,%f,%f\n",first_copy[0],first_copy[1],first_copy[2],first_copy[3]);
}

错误原因:error C2440: ‘=’ : cannot convert from ‘double *’ to ‘double [4]’
这样是不对的因为返回的是一个指针而接收的却是一个数组,这是不能画等号的,正确的做法是:

#include<stdio.h>
double *copy1(double array[],double c1[],int n)
{
int i;
for(i=0;i<n;i++)
c1[i]=array[i];
return c1;
}

void main()
{
int size=4;
double source[4]={1,2.3,4};
double first_copy[4];
double *fp;
fp=copy1(source,first_copy,size);
printf("The first copy: %f,%f,%f,%f\n",fp[0],fp[1],fp[2],fp[3]);
}

用一个指针去接收一个指针才是正确的,今天先写到这里,以后再补充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值