C语言  指针语法

#include<stdio.h>
#include<stdlib.h>
main(){
int a=10;
int* pointer=&a;
}

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

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

 

指针赋值给变量

int a = 10;
int* pointer = &a;//吧地址赋值给指针 指针本身是存储地址的
int b = *pointer;
  • 指针 int i = 123; int* pointer = &i;
  • pointer 取到的是i的地址
  • *pointer 取到的是i的值
  •   &pointer 取出pointer自己的地址
  • 野指针 指针赋值操作之前要先初始化 给指针变量赋一个程序中声明的变量的地址
  • int* 指向int类型变量的地址
  • 值传递和引用传递 都是传递的值 但是引用传递传递的是地址值 子函数修改main函数的变量的值 一定要用引用传递
  • 指针和数组的关系 数组就是连续的内存空间 拿到数组的首地址 就可以对数组的每一个元素进行操作 通过指针的位移运算 位移运算 指针变量+1移动的字节数跟指针的类型有关
  • 指针的长度 32位操作系统4个字节 64位 8字节

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

#include<stdio.h>    
#include<stdlib.h>
/**
"*" 的几个含义 int* 声明一个int类型的指针变量
x * y 乘法运算
int* pointer;
*pointer; 取出指针变量pointer 中保存的内存地址对应的内存中的值
*/
main(){
int i =1;
int j = 2;
//char c;
function(&i,&j);
printf("i = %d,j = %d\n",i,j);
system("pause");
}
function(int* pointer, int* pointer2){
*pointer *= 2;
*pointer2 *=2;
}

数组与指针的干系

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

}

多级指针

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

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

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

 

C语言结构体

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

#include<stdio.h>    
#include<stdlib.h>
/**
c结构体 类似java的class struct来声明c的结构体
结构体的大小大于等于结构体中每一变量的占字节数的和
结构体的大小是最大的那个变量所占字节数的整数倍
C结构体中不能定义函数

函数指针的定义 返回值(*函数指针变量名字)(返回值);
-> 间接引用运算符
*/
void study(){
printf("good good study!\n");
}
struct Student{
int age; //8
int score; // 4
char sex; //1
void(*studypointer)();// 函数指针的定义
};
main(){
stud stu = {18,100,'f'};
stu.studypointer = &study;
stu.studypointer();//调用结构体里面的方法
struct Student* stuPointer = &stu;//结构体指针使用
printf("*stuPointer.age = %d\n",(*stuPointer).age);
(*stuPointer).sex ='m';//改变结构体的值
printf("stu.sex = %c\n",stu.sex);
printf("stuPointer->age = %d",stuPointer->age);//stuPointer->age 间接引用运算符
//printf("stu.age = %hd\n",stu.age);
//printf("stu.score = %d\n",stu.score);
//printf("stu.sex = %c\n",stu.sex);
// printf("结构体student占%d个字节\n",sizeof(stu));
system("pause");
}

C语言的联合体

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

C语言枚举

#include<stdio.h>    
#include<stdlib.h>
/**
*/
enum weekday{
MON=9, TUE, WEND,THUR,FRI,SAT,SUN
};
main(){
enum weekday day = MONe;
printf("day= %d",day);
system("pause");
}

#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等等。用这些基本数据类型声明变量通常是这样:

 

char     a; //变量a的类型均为字符型char
char letter;
int x,
y,
z; //变量x,y和z的类型均为整型int
int number;
double m, n;
double result; //变量result的类型为双精度浮点型double

 

 

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

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

enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};



enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

 

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

enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //变量workday的类型为枚举型enum DAYenum //跟第一个定义不



enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //变量days的类型为枚举型enum week



enum BOOLEAN { false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量

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

 

typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此处的workday为枚举型enum workday的别名



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



enum workday中的workday可以省略:

typedef enum
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此处的workday为枚举型enum workday的别名

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

 

 

也可以用这种方式:

 

typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
};

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

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

 

 

 

C语言自定义类型

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

#include<stdio.h>    
#include<stdlib.h>
/**
*/
typedef int i;
main(){
i j = 123;
printf("j = %d\n",j);
system("pause");
}