今天,我首先想讲一下,关于指针,关于C语言的一点心得。
我接触的第一门编程语言就是C,那时候觉得指针特别难懂,关于它的用法脑子里很乱。直到学数据结构时,彻底的弄懂了它。
指针也是一个变量,既然是变量,那么他在内存里就会占用空间,占内存里面就会放数据,只不过他所放的数据是一个内存地址罢了。
我感觉想要弄懂这个指针应该从他所占的内从长度开始。
下面举一个简单的例子:
int a;
char c;
int * pa = &a;
char* pc = &c;
这里pa和pc都是指针,但是它们所指向的类型不一样,pa指向的是int,而pc指向的char。
我们知道,char在系统中就是占用1个字节长度的,而int是占4个字节长度的。那么指向他们的指针所占的内存是多大呢?是不是pa大于pc呢?
答案是,不是的,他们的长度应该是一样长的。那么,为什么呢?
因为他们都是用来存一个地址的,比如在32位的系统中,他们所占内存的长度就是4个字节,因为32位系统的地址用4个字节就可以I表示了。所以无论指向哪一个内存地址,都可以放在这4个字节中。无论指向的内容是什么,类也好,char也罢,他们的首地址的长度就可以用4个字节表示。因此,任何指针所占的内存长度是一样的。
我们只要记住一点指针在内存里储存的就是一个内存地址,所以pa就是一个地址,pc也是一个地址。
既然他们是一个地址,那么在他们的前面加上 * (运算符名字不记得了,不好意思),就是取出相应地址中的内容。
如果赋值 a = 4 ,那么*p 就是4。
当然上面这种是最简单的,对于数组,例如:
char c[2][3];
c是一个常指针,这里存放的就是一个地址,使整个二维数组的首地址,存在下面的关系成立。
c是真个的首地址,*c就是第一行的首地址,就是c[0],其实在不考虑类型的情况下,c与c[0所得结果是一样的。*(c+1)就是第二行的首地址,就是c[1]。
*(c+1)+2 就是 c[1]+2,就是&c[1][2];
当然*(*(c+1)+2)就是c[1][2];
通过上面的例子,对于指针应该有所理解了吧。