A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 chunhuayun 于 2015-9-27 06:40 编辑

10.使用指针交换两个变量的值
  1. #include <stdio.h>
  2. //不使用指针的交换函数
  3. void swap(int a, int b){
  4.     int temp = a;
  5.    a = b;
  6.    b = temp;
  7. }
  8. //使用指针的交换函数
  9. void swapByPointer(int * a, int * b){
  10.     int temp = *a;
  11.    *a = *b;
  12.    *b = temp;
  13. }

  14. int main(int argc, const char * argv[])
  15. {
  16.     int A = 10;
  17.     int B = 123;
  18.     swap(A,B);
  19.     printf("After swap A = %d,B = %d\n", A,B);
  20.     swapByPointer(&A,&B);
  21.     printf("After swap by pointer A = %d,B =%d\n", A, B);
  22.    
  23.     return 0;
复制代码


打印结果:

After swap A = 10,B = 123
After swap by pointer A = 123,B = 10
分析:因为不用指针的值传递只是把原变量的值拷贝了一份给函数,不会影响到原值。用指针做参数传递,是把变量的地址传递到函数,这样会改变原值。指针做参数传递可以实现函数返回多个值。

11.指针的常见应用场景
A.在函数中间接访问调用者中的变量

B.让函数返回多个值

12.二级指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量,也称为"多级指针"
例如:

  1.     int a = 10;
  2.     int *p = &a;
  3.     int **p2 = &p;
  4.    
  5.     printf("a = %d", **p2);
复制代码

打印结果

a = 10

例外我试过,其实int *p2 = p跟int **p2 = &p的效果是一样的
  1.     int a = 10;
  2.     int *p = &a;
  3.     int **p2 = &p;
  4.     int *p3 = p;
  5.     printf("*p2 = %d\n", *p2);
  6.     printf("*p3 = %d", p3);
复制代码

打印结果:

p = 10
*p2 = 1606416668
*p3 = 1606416668

12.指针为什么要区分类型?

在同一个编译器下,所有指针变量占用的字节数都一样
  1.     int a = 10;
  2.     char ch = 'a';
  3.     float b = 123.3f;
  4.     double c = 123.2;

  5.     int *pa =&a;
  6.     char *pch = &ch;
  7.     float *pb = &b;
  8.     double *pc = &c;
  9.    
  10.     printf("int pointer size = %ld\n", sizeof(pa));
  11.     printf("char pointer size = %ld\n", sizeof(pch));
  12.     printf("float pointer size = %ld\n", sizeof(pb));
  13.     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型在内存中只占用一个字节,那么此时只会取一个字节,这样就会有预料不到的后果。

如下图:(盗用讲课老师的)




6 个回复

倒序浏览
看着好费劲,代码排列一下好看些
回复 使用道具 举报
hailiqh 发表于 2015-9-26 21:37
看着好费劲,代码排列一下好看些

不好意思哈,昨天太马虎了,忘了检查格式了
回复 使用道具 举报
上面的那个“其实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:51
上面的那个“其实int *p2 = p跟int **p2 = &p的效果是一样的”,这句话我是认同的,但是你下面的截图和数值 ...

对的对的,不好意思啊,其实那个p=10不应该写出来的,我当时赋值过来的时候弄错了呢。你说的是对的
回复 使用道具 举报
Jusive 中级黑马 2015-9-27 10:34:50
7#
楼主一看就是个大神级人物啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马