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