C语言学习笔记6

typedef + 类型 + 别名

/*
typedef unsigned int UINT;
typedef int* AA;
typedef int ARR[5];//使用typedef定义别名时,也要符合原来的格式
*/

int main()
{
	UINT a = 10;
	unsigned d = 10;
	printf("%d\n%d\n", a, d);
	int* p,p0;//此时的p是int*类型,p0是int类型
	AA p1,p2;//此时p1和p2都是AA,也就是int*类型

	int arr[5];
	ARR arr1;

	return 0;
}

const

int main()
{
	const int a = 1;
	//a = 2;//被const修饰的变量会变成常量,不可以再进行修改
	//const int d;//const修饰的变量必须初始化

	int c;
	const int* p1 = &c;//和int const *是一样的 
					   //const在*左边,p可以改(可以改指向谁的地址),*p不可改(不可以改指向的地址上的内容)
	int* const p2 = &c;//const在*右边,p不可以改,*p可以改;
	int const* constp3 = &c;//两边都有const的时候,都不可以改

	return 0;
}

define + 宏的名字 + 要替换的内容

//1.预处理	  2.编译	 3.汇编	4.链接
//单纯的替换

#define AA printf("hello\n")
#define BB int *   //最好不加分号。
				   //如果加了的话 程序中写BB a;来定义变量的时候会错,因为实际上是int;a;
int main()
{
	AA;
	BB a, b;//此时a是int*类型,b是int类型
	return 0;
}

有参数的宏

#define ADD(a,b)  a + b
#define MUL(a,b)  a * b
#define ARRLEN(a)	sizeof(a)/sizeof(a[0])
int main()
{
	printf("%d\n", ADD(1, 2));
	printf("%d\n", MUL(2+2, 3+3));
		//输出为11的原因是:2+2*3+3=11,宏定义时加上括号即可:#define MUL(a,b)  (a) * (b)
	
	int arr[5];
	printf("%d\n", ARRLEN(arr));
	
	return 0;
}

位运算

int main()
{
	//与		&	//都是1为1
	//或		|	//有1就为1
	//取反	~	//1和0互变
	//异或	^	//相同为0 不同为1
	//左移	<<	//左移补0
	//右移	>>	//右移补符号位(若为无符号类型,补0)
	
	int a = -1;
	-1 >>5//-1为1111 1111,所以不管移动几位,最后补完都是1111 1111

	int a = 1;
	int b = 2;
	//交换a与b的内容
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;

	printf("%d\n%d\n", a, b);
	return 0;
}

函数:对步骤的封装

//返回值 + 函数名 +(参数类型)+ ;
//void 无返回值
//返回值只有一个

void printHello();//函数声明
int Add11();
int ADD(int,int);

int main()
{
	printHello();//函数调用
	Add11();
	int c = Add11();
	printf("%d\n", c);

	int d = 2;
	int a = ADD(1, d);//实参//其实是还有一个隐藏的实参给形参赋值的过程:int a=1;int b=d;
	printf("%d\n", a);
	printf("%d\n", ADD(2, Add11()));
	return 0;
}


void printHello() //函数具体实现
{
	printf("Hello!\n");
	return;
	//函数遇到return就结束
	printf("Hi!");
}

int Add11() 
{
	int a = 1;
	int b = 1;
	int c;
	c = a + b;
	return c;
}

int ADD(int a, int b) //形参
{
	return a + b;
}

数组传参

void PrintARR();
//void PrintARRPro(int arr[]);
void PrintARRPro(int arr[],int len);

int main() 
{
	//PrintARR();
	int arr[] = { 1,2,3,4,5 };
	//PrintARRPro(arr);	
	//传参过程为:int arr[]=arr,现在赋值的是首元素的地址 ,也就是int arr[] = *arr;
	//数组名字在两种情况下才代表数组本身(即该段连续的空间)1.对数组名进行取地址   2.数组名出现在sizeof之后
	//其余数组名表示首元素的地址:比如:函数传参— > int*

		//int array[] = { 1, 2, 3, 4, 5 };

		//int* p1 = array;
		//int* p2 = array + 0;
		//int* p3 = &array[0];

		//printf("%d\n", p1);
		//printf("%d\n", p2);
		//printf("%d\n", p3);	//三个结果都是一样的
	PrintARRPro(arr,sizeof(arr) / sizeof(arr[0]));

	return 0;
}

void PrintARR()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	int i;
	for (i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}

void PrintARRPro(int arr[],int len) 
{
	int i;
	int n;
	n = sizeof(arr) / sizeof(arr[0]);//结果等于1,原因是:arr其实不是数组名,是*arr,指针大小是4,所以4除以4得到1
	//所以数组传参我们要得到数组的长度,所以需要两个参数(首元素的地址+数组长度)

	for (i = 0; i < len; i++)
	{
		printf("%d\n", arr[i]);
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

97Marcus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值