D16. 指针(1)

博客围绕指针展开,虽未给出具体内容,但可推测会涉及指针的基本概念、使用方法等信息技术领域关键信息。
指针  基类型*指针变量名
//野指针 1.声明指针没有合法化 2.malloc
//int *p 单指针
//int **p1 双指针
//int (*p2)[3] 数组指针
//int *p3[3] 指针数组 (存储指针的数组)
//int (*p4)(int,int) 函数指针
//int (*p4[3])(int,int) 函数指针数组
//int *p5(int,int) 指针函数 (返回指针的函数)

//int a = 5;   一级指针
//int *p = &a;

#include<stdio.h>
#include<stdlib.h>

//1.交换内容,必须有地址
//void swap(int *x, int *y)
//{
//	int t;
//	t = *x;
//	*x = *y;//取* ,就是取内容
//	*y = t;
//}
//void main()
//{
//	int a = 5, b = 7;
//	swap(&a, &b);
//	printf("%d,%d\n", a, b);
//	system("pause");
//}

//2.
//void main()
//{
//	char a[] = { 1, 1, 1, 1, 1 };
//	int *p = (int *)a;//*p 指向基类型跨基类型字节数
//	printf("%d\n", *p);
//	system("pause");
//}

//3.数组下标,当前数组元素距离首地址偏移量
//数组3个特点 : 有序性(下标有序), 连续性(占连续内存空间, 随机存储), 一致性(数组中元素类型一样)
//一维数组名可当作单指针来用(单指针加1,相当于加1个元素
//一维数组名取地址,相当于二位数组行指针
//二维数组名可当作行指针来用,也就是数组指针(int (*p)[4] )来用
//a[0]~*a    a[i]~*(a+i)
//a[0][0]~**a  a[i][j]~*(*(a+i)+j)
//void main()
//{
	//int a[] = { 1, 2, 3, 4, 5 };
	//int *p = (int *)(&a + 1);//p指向5后面一个元素
	////int *p=a+1; 把a1地址给p
	//printf("%d\n", *(p - 1));
//	int a[3][4];
//	printf("%d,%d,%d\n", a, a[0], &a[0][0]);//a, a[0], &a[0][0]三个地址一样
//	printf("%d,%d,%d\n", a, a + 1,  &a[1]);// a + 1,  &a[1]地址一样
//	system("pause");
//}
//4.冒泡排序
//void main()
//{
//	int a[] = { 7, 6, 8, 9, 0, 1, 2, 3, 4, 5 };
//	int i, j, t;
//	int n = sizeof(a) / sizeof(a[0]); 
//	int *p=a;//所有a换p
//	for (i = 0; i < n - 1; ++i)
//	{
//		for (j = 0; j < n - i - 1; ++j)
//		{
//			if (a[j]<a[j + 1])
//			{
//				t = a[j];
//				a[j] = a[j + 1];
//				a[j + 1] = t;
//			}
//		}
//	}
//	//for (i = 0; i < n; ++i)
//	//{
//	//	printf("%d", a[i]);//1.a[i]2.*(a+i)3.*(p+i)4.a[i]5.*p,效率最高
//	//	printf("\n");
//	//}
//	for (p = a; p <a+10; ++p)
//	{
//		printf("%d", *p);
//		printf("\n");
//	}
//	system("pause");
//}
//逆序
//void main()
//{
//	int a[] = { 7, 6, 8, 9, 0, 1, 2, 3, 4, 5 };// 将 i 和 n-i-1 交换
//	int n = sizeof(a) / sizeof(a[0]);
//	int *p = a, *q = a + n - 1;//p指向7,q指向5
//	while (p < q)
//	{
//		int t = *p;
//		*p = *q;
//		*q = t;
//		++p;
//		--q;
//	}
//	for (int i = 0; i < n; ++i)
//	{
//		printf("%d", a[i]);
//		printf("\n");
//	}
//	system("pause");
//}
//纯指针实现冒泡排序
void main()
{
	int a[] = { 7, 6, 8, 9, 0, 1, 2, 3, 4, 5 };
	int n = sizeof(a) / sizeof(a[0]);
	int *p = a, *q = a + 1, *end = a + n - 1;
	for (p = a; p < a + n - 1; ++p)//趟数
	{
		for (q = a; q < end; ++q)//次数
		{
			if (*q < *(q + 1))
			{
				int t = *q;
				*q = *(q + 1);
				*(q + 1) = t;
			}
		}
	}
	end--;
	for (p = a; p < a + 10; ++p)
	{
		printf("%d", *p);
		printf("\n");
	}
	system("pause");
}

 

module async_fifo #( parameter DATA_WIDTH = 'd8 , //FIFO位宽 parameter DATA_DEPTH = 'd16 //FIFO深度 ) ( //写数据 input wr_clk , //写时钟 input wr_rst_n , //低电平有效的写复位信号 input wr_en , //写使能信号,高电平有效 input [DATA_WIDTH-1:0] data_in , //写入的数据 //读数据 input rd_clk , //读时钟 input rd_rst_n , //低电平有效的读复位信号 input rd_en , //读使能信号,高电平有效 output reg [DATA_WIDTH-1:0] data_out , //输出的数据 //状态标志 output empty , //空标志,高电平表示当前FIFO已被写满 output full //满标志,高电平表示当前FIFO已被读空 ); //reg define //用二维数组实现RAM reg [DATA_WIDTH - 1 : 0] fifo_buffer[DATA_DEPTH - 1 : 0]; reg [$clog2(DATA_DEPTH) : 0] wr_ptr; //写地址指针,二进制 reg [$clog2(DATA_DEPTH) : 0] rd_ptr; //读地址指针,二进制 reg [$clog2(DATA_DEPTH) : 0] rd_ptr_g_d1; //读指针格雷码在写时钟域下同步1拍 reg [$clog2(DATA_DEPTH) : 0] rd_ptr_g_d2; //读指针格雷码在写时钟域下同步2拍 reg [$clog2(DATA_DEPTH) : 0] wr_ptr_g_d1; //写指针格雷码在读时钟域下同步1拍 reg [$clog2(DATA_DEPTH) : 0] wr_ptr_g_d2; //写指针格雷码在读时钟域下同步2拍 //wire define wire [$clog2(DATA_DEPTH) : 0] wr_ptr_g; //写地址指针,格雷码 wire [$clog2(DATA_DEPTH) : 0] rd_ptr_g; //读地址指针,格雷码 wire [$clog2(DATA_DEPTH) - 1 : 0] wr_ptr_true; //真实写地址指针,作为写ram的地址 wire [$clog2(DATA_DEPTH) - 1 : 0] rd_ptr_true; //真实读地址指针,作为读ram的地址 //地址指针从二进制转换成格雷码 assign wr_ptr_g = wr_ptr ^ (wr_ptr >> 1); assign rd_ptr_g = rd_ptr ^ (rd_ptr >> 1); //读写RAM地址赋值 assign wr_ptr_true = wr_ptr [$clog2(DATA_DEPTH) - 1 : 0]; //写RAM地址等于写指针的低DATA_DEPTH位(去除最高位) assign rd_ptr_true = rd_ptr [$clog2(DATA_DEPTH) - 1 : 0]; //读RAM地址等于读指针的低DATA_DEPTH位(去除最高位) //写操作,更新写地址 always @ (posedge wr_clk or negedge wr_rst_n) begin if (!wr_rst_n) wr_ptr <= 0; else if (!full && wr_en)begin //写使能有效且非满 wr_ptr <= wr_ptr + 1'd1; fifo_buffer[wr_ptr_true] <= data_in; end end //将读指针的格雷码同步到写时钟域,来判断是否写满 always @ (posedge wr_clk or negedge wr_rst_n) begin if (!wr_rst_n)begin rd_ptr_g_d1 <= 0; //寄存1拍 rd_ptr_g_d2 <= 0; //寄存2拍 end else begin rd_ptr_g_d1 <= rd_ptr_g; //寄存1拍 rd_ptr_g_d2 <= rd_ptr_g_d1; //寄存2拍 end end //读操作,更新读地址 always @ (posedge rd_clk or negedge rd_rst_n) begin if (!rd_rst_n) rd_ptr <= 'd0; else if (rd_en && !empty)begin //读使能有效且非空 data_out <= fifo_buffer[rd_ptr_true]; rd_ptr <= rd_ptr + 1'd1; end end //将写指针的格雷码同步到读时钟域,来判断是否读空 always @ (posedge rd_clk or negedge rd_rst_n) begin if (!rd_rst_n)begin wr_ptr_g_d1 <= 0; //寄存1拍 wr_ptr_g_d2 <= 0; //寄存2拍 end else begin wr_ptr_g_d1 <= wr_ptr_g; //寄存1拍 wr_ptr_g_d2 <= wr_ptr_g_d1; //寄存2拍 end end //更新指示信号 //当所有位相等时,读指针追到到了写指针,FIFO被读空 assign empty = ( wr_ptr_g_d2 == rd_ptr_g ) ? 1'b1 : 1'b0; //当高位相反且其他位相等时,写指针超过读指针一圈,FIFO被写满 //同步后的读指针格雷码高两位取反,再拼接上余下位 assign full = ( wr_ptr_g == { ~(rd_ptr_g_d2[$clog2(DATA_DEPTH) : $clog2(DATA_DEPTH) - 1]) ,rd_ptr_g_d2[$clog2(DATA_DEPTH) - 2 : 0]})? 1'b1 : 1'b0; endmodule解释每行代码的作用
10-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值