#include <stdio.h>
#include <stdlib.h>
main(){
//sizeof() 可以取出 属性类型 的长度
//&代表取地址
printf("char的长度为%d\n",sizeof(char));
//signed int 数据修饰符 有int的数据
// unsigned int 代表无符号的int的类型
//& 就代表获取一个一个变量的地址
//指针 就是变量在内容的地址
//指针变量就是 存储指针的变量
/**
%d - int
%ld – long int
%c - char
%f - float
%lf – double
%x – 十六进制输出 int 或者long int 或者short int
%o - 八进制输出
%s – 字符串
*/
/**
定义一个指针变量
int*p ,int *P ,int * p 三种形式定义指针变量
*/
int i =5;
int*p ; //定义一个指针变量
p=&i; // 把i的地址给p
printf("%x",p); //22ff44
//-----------------------------------------------------
/**
*号操作符
含有:1. int* p 代表指针变量
2. x*y 乘法运算
3. int*p; 取出指针变量的值 *p,*号在指针变量的 前面代表取出指针变量里面的 "数据"
*/
//1.i的值改变p会变么? 不会,i的值该变了但是i的地址没有变 p是指针 存储是16进制 所以不变 ,i和p是俩回事 所以不影响
//某个值的改变 是否改变其他值 要看是"地址" 还是 "数据值"
//-----------------------------------------------------
/**
交换俩个数据
*/
int x =1;
int y =2;
int temp=0;
swap(x,y); //不会改变
swap2(&x,&y);
//c定义一个函数
void swap(int x ,int y){
temp = x;
x = y;
y = temp;
}
// 不会交换: x,y (x,y) 分别有自己的地址
//使用指针变量的方式
void swap2(int* x,int*y){
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
//java中的传递是 值传递还是引用传递?
/**
在java中只有值传递
Person p = new Person();
p 是地址,而我们在传递的时候其实是copy一个p而不是传递是引用
*/
//-----------------------------------------------------------------------------
/**
指针常见的错误
//指针变量没有赋值不能使用
1.int*p ;
print("*p = %d/n",*p); //read错误
2.
*p =123; //write
//类型错误
int i = 5;
char* p = &i; //编译错误类型不匹配
*/
//-----------------------------------------------------------------------------
/**
不可以使用 已经被回收的变量
*/
int*p;
f(&p); // 把地址传过去
printf("%#x\n",p); //
printf("%d\n",*p); //3 或-1 值取决于 printf("%#x\n",p);
//printf("%#x\n",p); 需要时间 所以方法里的 地址会被回收,而不打印没来得及回收
f(int**q){
int i=3;
*q = &i;
}
//-----------------------------------------
/**
指针和数组的关系
*/
// 打印一个字符串
char p[] = {'h','e','l','l','o','\0'};
char* arr = "hello";
//--------------------------------
//指针的运算
//动态的内存分配
/**
需要使用 malloc memory allocate 内存 申请
*/
#include <malloc.h> // 引入内存申请的头文件
main(){
//在推内存中声请int类型的内存空间
int*p= (int*)malloc(sizeof(int)); //声请多大的内存空间 单位是byte
*p = 4; // 往p里存放地址
}
free(摸个地址); //回收地址
//静态的内存分配
/**
由系统分配给的堆内存,自动声请,自动释放
*/
//-----------------------------------------
/**
多级指针
*/
int i =5;
int*p = &i;
int**q = &p;
int***r = &q;
println("%d\n",***r);
//-----------------------------------------
/**
函数指针
*/
int add(int x, int y){
return x+y;
}
main(){
int (*pf)(int x ,int y); //定义一个指针函数
}
pf = add;
println("d%\n",pf(3,2));
//----------------3-------------------------
/**
结构体
*/
// 定义结构体
struct Student{
int age;
long id;
float sccor;
}
main(){
// 给结构体负责
stuct Student st={80,'f',55.6f};
printl("age=%d\n",st.age);
}
// 结构体的长度
println("长度=%d\n",sizeof(st));
// 结构体指针
struct Student*pst;
priln("d%\n",(*pst).age);
priln("d%\n",pst->age);
//联合体的定义
// 使用的相同的内存空间 存放数据, 赋值的时候会覆盖,长度==最大数据类型的长度
struct data{int year, month,day} today; // 定义个结构体名字为today
union {long i; int k; char li;} mix; //定义一个联合体
// 联合体的作用:节省内存空间;
//特点:长度 以最大类型相同 ,赋值 都是相同的值 ,存储在同一块内存空间
//-----------------------------------------
/**
枚举 与java差不多
*/
/**
typedep 定义类型
*/
typedep int ha;
ha i = 5;
//-----------------------------------------
system("pause");
}
c语法
最新推荐文章于 2022-11-04 14:34:27 发布