C语言指针描述(一篇全部透C指针)

本文详细阐述了C语言指针的基础语法与高级应用,包括指针变量的赋值、野指针、多级指针、指针与数组的关系、利用指针返回多个值等核心概念。同时,文章还探讨了C语言中的结构体、联合体、枚举和自定义类型,为读者提供了全面的C语言进阶指南。

C语言指针描述(一篇全部透C指针)

C语言  指针语法

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. main(){
  4. int a=10;
  5. int* pointer=&a;
  6. }

C语言里面的指针只能操作地址  

 

指针赋值给变量

  1. int a = 10;
  2. int* pointer = &a;//吧地址赋值给指针 指针本身是存储地址的
  3. int b = *pointer;
  • 指针 int i = 123; int* pointer = &i;

  • pointer 取到的是i的地址

  • *pointer 取到的是i的值

  •   &pointer 取出pointer自己的地址

  • 野指针 指针赋值操作之前要先初始化 给指针变量赋一个程序中声明的变量的地址

  • int* 指向int类型变量的地址

  • 值传递和引用传递 都是传递的值 但是引用传递传递的是地址值 子函数修改main函数的变量的值 一定要用引用传递

  • 指针和数组的关系 数组就是连续的内存空间 拿到数组的首地址 就可以对数组的每一个元素进行操作 通过指针的位移运算 位移运算 指针变量+1移动的字节数跟指针的类型有关

  • 指针的长度 32位操作系统4个字节 64位 8字节

利用指针返回多个值      :  在C语言里面方法是不能返回数组的如果使用返回多个值可以通过指针改变该地址内容

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. "*" 的几个含义 int* 声明一个int类型的指针变量
  5. x * y 乘法运算
  6. int* pointer;
  7. *pointer; 取出指针变量pointer 中保存的内存地址对应的内存中的值
  8. */
  9. main(){
  10. int i =1;
  11. int j = 2;
  12. //char c;
  13. function(&i,&j);
  14. printf("i = %d,j = %d\n",i,j);
  15. system("pause");
  16. }
  17. function(int* pointer, int* pointer2){
  18. *pointer *= 2;
  19. *pointer2 *=2;
  20. }

数组与指针的干系

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. 数组实际上就是一块连续的内存空间
  5. */
  6. main(){
  7. char array[]={'a','b','c','d'};
  8. //int array[]={1,2,3,4};
  9. printf("array[0]=%#x\n",&array[0]);
  10. printf("array[1]=%#x\n",&array[1]);
  11. printf("array[2]=%#x\n",&array[2]);
  12. printf("array[3]=%#x\n",&array[3]);
  13. //数组变量名的地址实际上是第一个元素的地址
  14. char* pointer = &array;//表示吧数组地址付指针 数组每个单位多有一个独立的地址
  15. //在数组于指针里面 如这个*(pointer+0) 要开位数 如char 是 1 位 可以加一 如果是int 是4位 没有任何用
  16. printf("*(pointer+0) = %c\n",*(pointer+0));
  17. printf("*(pointer+1) = %c\n",*(pointer+1));
  18. printf("*(pointer+2) = %c\n",*(pointer+2));
  19. printf("*(pointer+3) = %c\n",*(pointer+3));
  20. }

多级指针

多级指针 数星星  有几个星就是几级指针 取值通过三级指针拿到最初的变量的值 ***point3 

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. 多级指针 数星星 有几个星就是几级指针 取值通过三级指针拿到最初的变量的值 ***point3
  5. */
  6. main(){
  7. int i = 123;
  8. //int类型的一级指针
  9. int* pointer = &i;
  10. //int类型的二级指针 二级指针只能保存一级指针的地址
  11. int** pointer2 = &pointer;
  12. //int类型的三级指针 三级指针只能存二级指针
  13. int*** pointer3 = &pointer2;
  14. printf("***pointer3 = %d\n",***pointer3);
  15. system("pause");
  16. }

 

C语言结构体

c语言结构体就是java里面 的对象类差不多下面看看例子

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. c结构体 类似java的class struct来声明c的结构体
  5. 结构体的大小大于等于结构体中每一变量的占字节数的和
  6. 结构体的大小是最大的那个变量所占字节数的整数倍
  7. C结构体中不能定义函数
  8. 函数指针的定义 返回值(*函数指针变量名字)(返回值);
  9. -> 间接引用运算符
  10. */
  11. void study(){
  12. printf("good good study!\n");
  13. }
  14. struct Student{
  15. int age; //8
  16. int score; // 4
  17. char sex; //1
  18. void(*studypointer)();// 函数指针的定义
  19. };
  20. main(){
  21. stud stu = {18,100,'f'};
  22. stu.studypointer = &study;
  23. stu.studypointer();//调用结构体里面的方法
  24. struct Student* stuPointer = &stu;//结构体指针使用
  25. printf("*stuPointer.age = %d\n",(*stuPointer).age);
  26. (*stuPointer).sex ='m';//改变结构体的值
  27. printf("stu.sex = %c\n",stu.sex);
  28. printf("stuPointer->age = %d",stuPointer->age);//stuPointer->age 间接引用运算符
  29. //printf("stu.age = %hd\n",stu.age);
  30. //printf("stu.score = %d\n",stu.score);
  31. //printf("stu.sex = %c\n",stu.sex);
  32. // printf("结构体student占%d个字节\n",sizeof(stu));
  33. system("pause");
  34. }

C语言的联合体

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. 联合体占字节数取决于 其中成员 占内存空间最大的那一个
  5. 也称为共用体 一般用于内存比较小的机器
  6. */
  7. union u{
  8. int num; //4
  9. double d; //8
  10. }
  11. main(){
  12. union u u1;
  13. u1.num = 123;
  14. u1.d = 123.456;
  15. printf("union占%d个字节\n",sizeof(u1));
  16. printf("u1.num = %d\n",u1.num); //
  17. system("pause");
  18. }

C语言枚举

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. */
  5. enum weekday{
  6. MON=9, TUE, WEND,THUR,FRI,SAT,SUN
  7. };
  8. main(){
  9. enum weekday day = MONe;
  10. printf("day= %d",day);
  11. system("pause");
  12. }

#define MON  1
#define TUE   2
#define WED  3
#define THU   4
#define FRI    5
#define SAT   6
#define SUN   7

(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

(5) 枚举型是预处理指令#define的替代。

(6) 类型定义以分号;结束。

 

2. 使用枚举类型对变量进行声明

新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:

 

  1. char     a; //变量a的类型均为字符型char
  2. char     letter;
  3. int        x,
  4.            y,
  5.            z; //变量x,y和z的类型均为整型int
  6. int       number;
  7. double  m, n;
  8. double  result; //变量result的类型为双精度浮点型double

 

 

既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

方法一:枚举类型的定义和变量的声明分开

  1. enum DAY
  2. {
  3.       MON=1, TUE, WED, THU, FRI, SAT, SUN
  4. };
  5. enum DAY yesterday;
  6. enum DAY today;
  7. enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
  8. enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

 

方法二:类型定义与变量声明同时进行:

  1. enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
  2. {
  3.     saturday,
  4.     sunday = 0,
  5.     monday,
  6.     tuesday,
  7.     wednesday,
  8.     thursday,
  9.     friday
  10. } workday; //变量workday的类型为枚举型enum DAYenum //跟第一个定义不
  11. enum week Mon=1TueWedThuFri SatSun} days; //变量days的类型为枚举型enum week
  12. enum BOOLEAN falsetrue } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量

方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:

 

  1. typedef enum workday
  2. {
  3.     saturday,
  4.     sunday = 0,
  5.     monday,
  6.     tuesday,
  7.     wednesday,
  8.     thursday,
  9.     friday
  10. } workday; //此处的workday为枚举型enum workday的别名
  11. workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday
  12. enum workday中的workday可以省略:
  13. typedef enum
  14. {
  15.     saturday,
  16.     sunday = 0,
  17.     monday,
  18.     tuesday,
  19.     wednesday,
  20.     thursday,
  21.     friday
  22. } workday; //此处的workday为枚举型enum workday的别名
  23. workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

 

 

也可以用这种方式:

 

  1. typedef enum workday
  2. {
  3.     saturday,
  4.     sunday = 0,
  5.     monday,
  6.     tuesday,
  7.     wednesday,
  8.     thursday,
  9.     friday
  10. };


workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:

 

 

 

C语言自定义类型

C语言自定义类型就是取别名

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /**
  4. */
  5. typedef int i;
  6. main(){
  7. i j = 123;
  8. printf("j = %d\n",j);
  9. system("pause");
  10. }

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值