对于指针的一点见解(我是c语言初学者)

文章探讨了对C语言指针的理解,包括如何通过指针赋值,swap函数的三种实现方式,特别是指针作为函数参数时如何交换变量值。指出了指针实际上存储的是地址而非值,且指针相加无意义,只能通过相减计算偏移量。此外,还简要提到了指针数组和数组指针的区别。
摘要由CSDN通过智能技术生成

对指针的理解:

举例 int = *p,如果你想赋值给*p这个指针,则必须赋值给*p中的p一个变量所在的地址,假如int x=1;那赋值给p的必须是&x,即p=&x;那此时*p其实就等于1,即*p == 1;

补充:有人可能会提出这样的情况:char *char_ptr; char_ptr = “point to me”;

这样是正确的,但是这里有人认为传入的是一个字符串的字面量,但实际上是将该字符串的首地址赋值给char_ptr,使char_ptr指向了该字符串的首地址。

---------以上是笔者第一次思考的理解,但是遇到下面这样的问题后,又出现了不理解的地方:

如何通过函数swap交换实参变量a和b?

方法一:

void swap ( int x, int y)
{
int temp;
 temp = x;
x = y;
y = temp;
}
main( )
{
    int a=2,b=3;
    swap(a,b);
}

方法二:

void swap ( int *px, int *py)
{
int *temp;
 temp = px;
px = py;
py = temp;
}
main( )
{
    int a=2,b=3;
    swap(&a,&b);
}

方法三:

void swap ( int *px, int *py)
{
int temp;
temp = *px;  /*间接取*/
*px = *py;    /*间接取,间接存*/
*py = temp;    /*间接存*/
}
 main( )
{
int a =2, b = 3;
swap ( &a, &b);
}

正确答案应该是三。

在这里笔者只解释方法三的逻辑,并且解释笔者为什么会疑惑。

swap函数传入的是a和b 的地址,进入到函数内部,定义了个临时变量temp存放*px的值,这里我还没有什么疑惑,因为我理解的*px是获取px地址的值。

但是下面句代码如果按照我的理解就有问题了:*px = *py; 我的错误理解:一个已经获取过值的变量(我此时还是将指针理解为特殊变量),仅仅修改这样一个变量的值,对于原地址应该不会起到任何作用啊。

后来经过分析理解和查阅,明白了:这句代码的意思是将指针px指向的地址上存储的值设置为指针py指向的地址上存储的值。所以其实我的一开始的理解有误,并不是获取值,而是指向地址。用比较直观的例子来讲就是:我之前的理解是将指针当作一个新的盒子,去把一个变量盒子里的内容复制过来一份;但是事实是,指针并不会复制一份过来,而是指向那个变量的地址,带着你找到那个变量盒子里的内容。到此真相大白

下一句代码因此也就非常容易理解了吗,就是将temp的值给到*py指向的那个地址空间去。

最终实现a和b的交换。

----------------------以上是笔者第二次的理解,应该比第一次更加细致和全面


对于指针数组和数组指针也可以这样理解:
先看数组指针(数组的指针)定义:char (*p)[10];这里括号将和p括起来,代表“指向p地址的值”,而后面数组就是“指向p地址”的数组;
再看指针数组(指针的数组)定义:char *p[10],这里和p没有被括起来,意思是其实是(p[10]),即“指向p[10]地址(首地址)”。

然后又遇到一个问题

如何计算中间指针呢?

如果是数学题,那可以这样:mid = (low + high ) /2

但是指针不是数,上面也说过,指针是地址,所以说指针的相加相当于是将两个指针所指向地址的值相加,这并没有意义,因为指针所指向的地址是一个无符号整数,没有定义加法运算。因此,指针只能通过相减来计算它们之间的偏移量。

所以正确的计算方式应该是:mid = low + (high – low)/2

(对于我目前的水平只能理解到这个程度,不过我觉得这些理解用于指针运算应该足够了。发出来主要是为了记录自己的学习过程,如有错误请多多指正)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值