C语言学习笔记:指针2

1.一维数组

1.1遍历

不使用局部变量,使用迭代器作为函数参数,下例:遍历去头去尾的数组a[]

不使用循环也不使用局部变量,要使用递归

1.2逆序

递归:

1.3选择排序

1.4二分查找法

1.5快速排序

1.找一个基准数——t;

2.从右至左找第一个比基准数小的数——q的新地址;

3.从左至右找第一个比基准数大的数——p的新地址;

4.交换p、q;

5.循环,直到p、q相遇;

6.交换基准数与p(q)的位置;

得到的数组左边都比基准数小,右边都比基准数大,然后把前后分开,递归,直到数组排除顺序。

注意:递归一定要有停止条件!如下例的:if(begin > end){return;}

void qSort(int *begin, int *end)
{
	if(begin > end)
	{
		return ;
	}
	int t = *begin;
	int *p = begin;
	int *q = end;

	while(p < q)
	{
		while(p < q && *q >= t)
		{
			--q;
		}
		while(p < q && *p <= t)
		{
			++p;
		}
		swap(p, q);
	}
	swap(begin, p);
	qSort(begin, p - 1);
	qSort(p + 1, end);
}

2.字符串

2.1

char s[100] = "Hello";
char *p;
p = "Hello World!";//此处赋值赋的是字符串首元素的地址,即“H”的地址

数组不能这么赋值,因为数组不能整体引用;

如果*p = 'A';puts(p) 则程序会崩溃,因为字符串常量不能更改,它在字符串常量区,而p在栈区

但p = s;*p = 'A';puts(p) 则会输出“Aello”

2.2const

const加在指针变量前,表示无法通过该指针去修改它所指向的变量,即const修饰的是*p,而非指针变量p;如:int i = 10;const int *p;p = &i可以,但*p = 100不行

而const在其它变量前则表示该变量无法修改;

int * const p 则表示p无法修改,即p = &i不行,但*p可以修改;

加不加const要看函数有没有必要通过指针去修改所指向变量的内容,能加const尽量加const;

2.3字符串遍历

2.4输出字符串有效字符个数

没有循环和局部变量的,递归(一般不使用,效率低,占内存)

2.5把字符串2拷贝给字符串1

把字符串2前n个字节拷贝给字符串1

n > *src的长度也只拷贝*src,不会越界,所以循环条件有n != 0;

2.6字符串连接

把源字符串的前n个字节连接在目标字符后

2.7字符串大小比较

比较源字符串和目标字符串前n个字节的大小;

注意--n放在while循环语句中,因为字符串的第一个元素对应的位置是0,而字节则是从1开始;

size_t n 表示前n个字节

2.8万能指针

void *p p可以接受任何类型的地址,但是p不能进行指针运算,因为运算后为void型,C语言中不能有void型变量。

万能指针主要作用是用来强制类型转换,如下的strncat,则可以把任意类型的字符串连接。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值