c语言指针专题复习笔记

c语言指针

/*
使用指针的好处:
1.使程序简洁、紧凑、高效
2.有效的表示复杂的数据结构
3.动态分配内存
4.得到多于一个的函数返回值
*/
test1:概念->存储地址的变量
test2:运算->算术运算、赋值运算、关系运算
test3:二维数组指针
test4:字符指针与字符串指针
test5:指针数组与多级指针
test6:void指针与const修饰符
环境—>Visual Stdio 2019

#include <stdio.h>

void test1(void);
void test2(void);
void test3(void);
void test4(void);
void test5(void);
void test6(void);

int main(void)
{
	test1();test2();test3();
	test4();test5();test6();
	return 0;
}
/*指针的基本概念*/
void test1(void)
{
	int a = 1;
	int* p = &a;

	printf("test1:p:%p  *p:%d  &p:%p\n",p,*p,&p);
	puts("");
}
/*指针之间的运算与一维数组指针*/
void test2(void)
{
	int a[] = {1,2,3,4,5};
	int* p = a;
	int i,n,t;
	int* q;

	i = sizeof(a) / sizeof(int); n = i;//得到数据个数
	printf("test2: *(p+2):%d  &a[3]-&a[0]:%d",*(p+2), (&a[3] - &a[0]));
	/*使用指针遍历数组*/
	printf("    使用一级指针遍历一维数组:");
	while (i != 0){	
		printf("%d ",*(p+n-i));
		i--;
	}
	printf("\n      ");
	printf("一维数组值的四种表达方式:");
	printf("*(p+1):%d p[1]:%d a[1]:%d *(a+1):%d", *(p + 1), p[1], a[1], *(a + 1));


	printf("\n      ");
	printf("使用一级指针实现数组反转:");
	q = &a[n-1];
	while (p < q) {
		t = *p;
		*p = *q;
		*q = t;
		p++; q--;
	}
	i = n;
	while (i != 0) {
		printf("%d ",a[n-i]);
		i--;
	}
	puts("");
	puts("");
}
/*二维数组指针*/
void test3(void)
{
	int a[2][3] = {{1,2,3},{4,5,6}};
	int* p1;
	int(*p2)[3];//行指针变量
	p2 = a;

	printf("test3:%p %p %p: %p: \n",a,a+1,a[0]+1,*a+1);//*改变了指针的性质
	printf("    使用行指针表示二维数组:%d\n",p2[1][1]);
	printf("    从行指针变为一级指针  :%d   %d\n", *(*(a+1)+1),*(*(p2+1)+1));
	puts("");
}
/**/
/*字符指针与字符串指针*/
void test4(void)
{
	char ch = 'q';
	char str[100] = "vscode";
	char* p = "vstdio";
	char* p1 = &ch;
	char* p2 = &str;
	int i = 0;

	printf("test4: %c %s %s\n",*p1,p,p2);

	//实现两个字符串的连接
	while (*(p2 + i) != '\0')
		i++;
	while (*p != '\0') {
		*(p2 + i) = *p;
		p++;
		i++;
	}
	*(p2 + i) = *p;
	printf("        ");
	puts(p2);
	puts("");
}
/*指针数组与多级指针*/
void test5(void)
{
	int a[2][3] = { {1,2,3},{7,8,9} };
	int* p[2];
	int** p1;

	p[0] = a[0];
	p[1] = a[1];
	

	printf("test5: %d %d\n",*(p[0]+1),*p[1]);

	p1 = p;
	printf("       %d\n",**p1);
	puts("");
}
/*void指针与const修饰符*/
void test6(void)
{
	int m = 4,i;
	void* p;
	int a[5] = {1,2,3,4,5};
	int n = 2;
	//const修饰什么什么就不能改
	const int* b;//修饰变量
	int* const c = &n;//修饰地址

	p = (void*)&m;//强制转换,其实这里可以隐式转换
	printf("test6: %d\n       ",*(int *)p);
	//使用void指针遍历数组
	p = a;
	for (i = 0;i < 5;i++)
		printf("%d",*((int *)p+i));

	b = &m; b++;//合法,修改地址
	*c +=1;//合法,修改变量
	puts("");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~Eliauk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值