指针的概念及使用
写在前边:
1.*:解引用运算符
2.&:取地址运算符
3.指针也是一种数据类型,是由其他数据类型派生出来的。指针的最大作用是构造数据结构:将不连续的内存空间连接在一起。通过解引用运算符(*)获取p在内存地址上保存的值,*p就代表指针p所指向的内存单元中的值
正文:
1.当定义一个变量(int a=100)后,计算机会将变量a的值100转变为二进制储存进一段连续的内存空间,第一个内存空间的编号就是变量a的地址,使用&a可以获取该地址值。
2.当定义一个指针(int *p)后,c程序会在内存中划分一段内存空间,用来存储*p的值。指针类型为int,指针类型的变量为p。
3.当定义一个指针指向变量a的地址(int *p =&a)时,称:p是指向int类型变量a的指针,简称p指向a。此时指针变量p的值,是变量a在内存中存储的第一个地址单元的编号即&a。通过指针类型(int),c程序可以知道这个指针指向的数据占用了4个内存单元,从而正确读出a存储在4个内存空间上的数据。
指针的加减运算:当p = p+1时,p所保存的地址会加上指针类型(int)所占用的存储单元的个数(int是4个字节,即4byte=4*8bit),从而使指针跨越当前数据,指向下一个完整的数据。
例:
int main() { int a = 100; int *p = &a; printf("%s %d\n","定义指针后,将a的地址赋给p,p的值:",p); printf("%s %d\n","a的地址:",&a); printf("%s %d","使用解引用运算符获取指针p所指向元素的值,即为a的值:",*p); }
依次输出:
>>>定义指针后,将a的地址赋给p,p的值: 6422036
>>>a的地址: 6422036
>>>使用解引用运算符获取指针p所指向元素的值,即为a的值: 100
指针的使用,以传值和传址为例:
例:写一个程序,交换a和b的值
1.错误示范:
int main(){ int i = 3; int j = 5; swap(i,j); printf("%d\n%d",i,j); } int swap(int x,int y){ int buf; buf = x; x = y; y= buf; return 0; }
输出:
>>>3,5
2.修改代码如下:
int main(){ int i =3; int j =5; swap(&i,&j); printf("%d\n%d",i,j); } int swap(int *x,int *y){ int buf; buf = *x; *x = *y; *y= buf; return 0; }
输出:
>>>5,3
其他关于传值和传址的解释说明:
http://c.biancheng.net/view/216.html
https://blog.csdn.net/ljx_5489464/article/details/50035875