黑马程序员技术交流社区
标题: C语言学习笔记之指针的使用 [打印本页]
作者: chunhuayun 时间: 2015-9-26 21:32
标题: C语言学习笔记之指针的使用
本帖最后由 chunhuayun 于 2015-9-27 06:40 编辑
10.使用指针交换两个变量的值
- #include <stdio.h>
- //不使用指针的交换函数
- void swap(int a, int b){
- int temp = a;
- a = b;
- b = temp;
- }
- //使用指针的交换函数
- void swapByPointer(int * a, int * b){
- int temp = *a;
- *a = *b;
- *b = temp;
- }
-
- int main(int argc, const char * argv[])
- {
- int A = 10;
- int B = 123;
- swap(A,B);
- printf("After swap A = %d,B = %d\n", A,B);
- swapByPointer(&A,&B);
- printf("After swap by pointer A = %d,B =%d\n", A, B);
-
- return 0;
复制代码
打印结果:
After swap A = 10,B = 123
After swap by pointer A = 123,B = 10
分析:因为不用指针的值传递只是把原变量的值拷贝了一份给函数,不会影响到原值。用指针做参数传递,是把变量的地址传递到函数,这样会改变原值。指针做参数传递可以实现函数返回多个值。
11.指针的常见应用场景
A.在函数中间接访问调用者中的变量
B.让函数返回多个值
12.二级指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量,也称为"多级指针"
例如:
- int a = 10;
- int *p = &a;
- int **p2 = &p;
-
- printf("a = %d", **p2);
复制代码
打印结果
a = 10
例外我试过,其实int *p2 = p跟int **p2 = &p的效果是一样的
- int a = 10;
- int *p = &a;
- int **p2 = &p;
- int *p3 = p;
- printf("*p2 = %d\n", *p2);
- printf("*p3 = %d", p3);
复制代码
打印结果:
p = 10
*p2 = 1606416668
*p3 = 1606416668
12.指针为什么要区分类型?
在同一个编译器下,所有指针变量占用的字节数都一样
- int a = 10;
- char ch = 'a';
- float b = 123.3f;
- double c = 123.2;
-
- int *pa =&a;
- char *pch = &ch;
- float *pb = &b;
- double *pc = &c;
-
- printf("int pointer size = %ld\n", sizeof(pa));
- printf("char pointer size = %ld\n", sizeof(pch));
- printf("float pointer size = %ld\n", sizeof(pb));
- printf("double pointer size = %ld\n", sizeof(pc));
复制代码
例如
打印结果:
int pointer size = 8
char pointer size = 8
float pointer size = 8
double pointer size = 8那么为什么还要区分类型呢?
因为如果存储的是一个int类型的变量,值266,占用四个字节,取出来的时候是按照char型取的,而char型在内存中只占用一个字节,那么此时只会取一个字节,这样就会有预料不到的后果。
如下图:(盗用讲课老师的)
作者: hailiqh 时间: 2015-9-26 21:37
看着好费劲,代码排列一下好看些
作者: chunhuayun 时间: 2015-9-27 06:40
不好意思哈,昨天太马虎了,忘了检查格式了
作者: 杰杰 时间: 2015-9-27 08:51
上面的那个“其实int *p2 = p跟int **p2 = &p的效果是一样的”,这句话我是认同的,但是你下面的截图和数值是不是有点不符合啊,P的值应该是个地址吧,不应该是个数值,*p是数值,而p应该是指向这个数值的地址。那个*p3应该是数值,不应该是地址,因为*p3=p p=&a 所以*p3应该是等于10吧。 而且你把地址转换成数值输出应该会有警告。因为没看懂我按着你的试了一遍。
int main(int argc, const char * argv[]) {
int a = 10;
int *p = &a;
int **p1 = &p;
int *p2 = p;
printf("p=%p\n",p);
printf("*p1=%p\n",*p1);
printf("*p2=%d\n",*p2);
return 0;
}
输出结果如下:
p=0x7fff5fbff7bc
*p1=0x7fff5fbff7bc
*p2=10
作者: 杰杰 时间: 2015-9-27 08:52
我也是新手.... 说错的地方不要打我,交流为主。

作者: chunhuayun 时间: 2015-9-27 09:23
对的对的,不好意思啊,其实那个p=10不应该写出来的,我当时赋值过来的时候弄错了呢。你说的是对的
作者: Jusive 时间: 2015-9-27 10:34
楼主一看就是个大神级人物啊
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |