[关闭]
@SuHongjun 2020-04-30T11:35:01.000000Z 字数 2459 阅读 178

C语言-Day 17-2 指针1

C语言 2020春季学期


指针定义及基础用法

最简单的指针定义的示例:

  1. #include "stdio.h"
  2. main()
  3. {
  4. int *p; //p就是一个指针变量,简称指针,指针变量定义的特征是 *
  5. }

指针变量的基础用法:

  1. #include "stdio.h"
  2. main()
  3. {
  4. int a = 5;
  5. int *p; //p就是一个指针,指针变量的特征是*; 指针首先是一个变量:名字p、类型是int *
  6. p = &a; //指针赋值的基本方式1。指针的实质是地址,也就是内存单元的编号,让指针p指向变量a
  7. printf("a: %d\n", a);
  8. printf("p: %d\n", p);
  9. printf("&a: %d\n", &a); // &a的值 等于p
  10. printf("*p: %d\n", *p); // *p 表示 p所指向单元的内容。 因为p指向a, *p也就是a的值
  11. *p = 9; //给指针所指赋值,因为p此时已经指向a,等价于 a = 9;
  12. printf("a: %d\n", a); //输出9
  13. //p = 9; //错误用法!!! 要避免给指针变量直接赋数值
  14. }

sizeof()运算符的作用

  1. #include "stdio.h"
  2. main()
  3. {
  4. char a, *p1;
  5. int b, *p2;
  6. double c, *p3;
  7. printf("char型变量a所占字节数:%d\n", sizeof(a));
  8. printf("char型变量所占字节数:%d\n", sizeof(char));
  9. printf("int型变量b所占字节数:%d\n", sizeof(b));
  10. printf("int型变量所占字节数:%d\n", sizeof(int));
  11. printf("double型变量c所占字节数:%d\n", sizeof(c));
  12. printf("double型变量所占字节数:%d\n", sizeof(double));
  13. printf("char * 型指针所占字节数:%d\n", sizeof(p1));
  14. printf("int * 型指针所占字节数:%d\n", sizeof(p2));
  15. printf("double * 型指针所占字节数:%d\n", sizeof(p3));
  16. }

运行结果:
char型变量a所占字节数:1
char型变量所占字节数:1
int型变量b所占字节数:4
int型变量所占字节数:4
double型变量c所占字节数:8
double型变量所占字节数:8
char * 型指针所占字节数:4
int * 型指针所占字节数:4
double * 型指针所占字节数:4

数组与指针

数组与指针基本用法

  1. //数组与指针基本用法示例1
  2. #include "stdio.h"
  3. main()
  4. {
  5. int i=9;
  6. static int s=5;
  7. int a[5]={1,2,3,4,5};
  8. int *p;
  9. p = &i; //指针赋值的基本方式1:让p指向变量 i
  10. printf("p=%d\n",p);
  11. p = a; //指针赋值的基本方式2:让p指向数组a的首地址,数组名本身就代表地址,相当于 p = &a[0];
  12. printf("p=%d\n",p);
  13. p = &s; //p指向静态变量s
  14. printf("p=%d\n",p); //静态变量因为是分配在静态存储区,地址值和动态变量的地址值相差比较大
  15. }
  1. //数组与指针基本用法示例2
  2. #include "stdio.h"
  3. main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p;
  7. p = &a[0]; //指针赋值的基本方式3:让p指向数组a的首地址,相当于 p = a;
  8. printf("p=%d,\t *p = %d",p,*p);
  9. p = a; //让p指向数组a的首地址,数组名本身就代表地址,相当于 p = &a[0];
  10. printf("p=%d,\t *p = %d",p,*p);
  11. }

输出为:
p=12253044, *p = 1
p=12253044, *p = 1

  1. //数组与指针基本用法示例3
  2. #include "stdio.h"
  3. main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p;
  7. p = a; //数组名就是地址, 让指针指向数组的首地址
  8. //a = p; //非法!不允许,虽然数组名和指针都表示地址,但是指针值可以被修改,而数组名不能被修改
  9. printf("%d\n", a[0]);
  10. printf("%d\n", *p); //p此时指向a[0]
  11. printf("%d\n", a[4]);
  12. printf("%d\n", p[4]); //指针一旦指向数组之后,可以用下标的方式来引用数组元素
  13. }

数组与指针进阶内容

  1. //数组与指针进阶内容1
  2. #include "stdio.h"
  3. main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p,i;
  7. p = a; //数组名就是地址, 让指针指向数组的首地址
  8. for(i=0; i<5; i++)
  9. printf("%d\t", a[i]); //传统方式遍历数组
  10. printf("\n");
  11. for(i=0; i<5; i++)
  12. printf("%d\t", p[i]); //指针方式1遍历数组,当指针指向数组之后,把指针按数组名的方式来用
  13. printf("\n");
  14. for(i=0; i<5; i++)
  15. {
  16. printf("%d\t", *p); //指针方式2遍历数组
  17. p++; //p++的结果是让p指向下一个数组元素,因为每个数组元素占4个字节,所以p值实际上加了4 //指向int 型的指针,自增实际是跳4个字节(1个int所占的内存字节数)
  18. }
  19. printf("\n");
  20. }
  1. //数组与指针进阶内容2
  2. #include "stdio.h"
  3. main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p;
  7. p = a;
  8. printf("%d\n", *a); //输出1,也就是a[0],数组名也可以按照指针的方式来用(不能修改指向的指针)
  9. printf("%d\n", *(p+2)); //输出3,也就是a[2], *(p+2)相当于a[2] ,也相当于*(a+2)
  10. }

C语言的学习要注重阅读代码,尤其越到后面,阅读代码的作用越来越重要。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注