C语言指针1

本是古典 何须时尚 2022-02-14 15:17 354阅读 0赞

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

先看这样一段代码,定义一个整型变量a和整型指针变量p,把a的地址赋给p,输出a的地址,p,p的地址。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. int a;
  6. int *p;
  7. p = &a;
  8. printf("%d %d %d\n", &a, p, &p);
  9. system("pause");
  10. return 0;
  11. }

输出结果
20190426114329301.png

注意:只能将地址赋给指针变量。

例如:

  1. int *p;
  2. p = 100;

这样的赋值是错误的,不能将一个数直接赋给指针变量。

  1. int *p;
  2. int a;
  3. p = &a;

指针是用来存放变量地址的,所以这样的赋值是合法的。

所有的指针变量都是4个字节

看这样一段代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct ABC
  4. {
  5. int a;
  6. char b;
  7. };
  8. int main()
  9. {
  10. int *p;
  11. char *q;
  12. float *i;
  13. struct ABC *n;
  14. printf("%d %d %d %d\n", sizeof(p), sizeof(q), sizeof(i),sizeof(n));
  15. system("pause");
  16. return 0;
  17. }

输出结果:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NnczcyMw_size_16_color_FFFFFF_t_70

&和*

&:取地址运算符 取出变量存放的地址

*:间 接运算符 取出储存在地址中的对应值

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. int a = 10;
  6. int *p;
  7. p = &a;
  8. printf("p:%d\n&a:%d\n*p:%d\na:%d\n&p:%d\n", p, &a, *p, a, &p);
  9. system("pause");
  10. return 0;
  11. }

输出结果:

20190426115944137.png

a里面存的是10,a有它对应的地址5240736,p里面存的是a的地址,p也有它对应的地址。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NnczcyMw_size_16_color_FFFFFF_t_70 1

看下面一段代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void swap1(int x, int y)
  4. {
  5. int temp;
  6. temp = x;
  7. x = y;
  8. y = temp;
  9. }
  10. void swap2(int *x, int *y)
  11. {
  12. int temp;
  13. temp = *x;
  14. *x = *y;
  15. *y = temp;
  16. }
  17. int main()
  18. {
  19. int a=100, b=200;
  20. //swap1(a, b);
  21. swap2(&a, &b);
  22. printf("%d %d", a, b);
  23. system("pause");
  24. return 0;
  25. }

这段代码中,swap1里面交换了x,y的值,swap2里面也交换了x,y的值,但最后只有swap2交换了a,b的值。

原因:

  1. 在函数在调用时,形参才会被分配内存,当函数调用结束时,形参的生命周期也就完结,自动释放,所以不会影响主函数ab的值;在函数里面xy的值交换了,但是不会影响ab
  2. swap2ab的地址传给形参,通过地址,找到ab的值,对ab进行了调换。
  3. 举个例子解释:教室的桌子上放着个纸条上面写着(10100),你人在家里想要调换这两个值,swap1就相当于你在家自己拿张纸条写了个(10010),然后扔掉,教室里面的纸上面数字并没有改变。swap2就相当于你在家拿纸条写上了10100的地址(位置),然后通过地址找到教室,把教室里面的纸上面的数字进行改变,然后把写有地址的那张丢掉,所以教室里的纸上面数字进行了交换。

发表评论

表情:
评论列表 (有 0 条评论,354人围观)

还没有评论,来说两句吧...

相关阅读

    相关 指针1C语言

    目录 1.指针是什么 2. 指针和指针类型 2.1 指针+-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 1. 指针未初始化 2. 指针越界访问

    相关 C语言指针详述(1)

    第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的

    相关 c语言指针

    //指针怎么用 // (区分两个概念,指针变量和指向内容,指针变量只保存一个地址值,在这个地址值对应的内存中具体存放的东西叫做指向内内容)   用变量

    相关 C 语言指针

    1、CPU 访问内存,是通过内存地址来读写内存数据的,CPU 与内存条硬件之间有个地址总线,CPU 通过地址总线将要访问/写入的内存地址告诉内存条。 2、对于 CPU 而言地

    相关 C语言指针1

      计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码