C语言指针

一、概述

1.内存

C语言指针_c语言

2.物理存储器和存储地址空间

C语言指针_空字符串_02

3.内存地址

C语言指针_空字符串_03
C语言指针_数组名_04

4.指针和指针变量

C语言指针_数组名_05

二、指针基础知识

1.指针变量的定义和使用

C语言指针_指针变量_06

2.通过指针间接修改变量的值

C语言指针_c语言_07

3.指针大小

C语言指针_c语言_08

4.野指针和空指针

C语言指针_空字符串_09

5.万能指针void *

C语言指针_数组名_10

6.const修饰的指针变量

C语言指针_数组名_11

三、指针和数组

1.数组名

C语言指针_空字符串_12

2.指针操作数组元素

C语言指针_空字符串_13

3.指针加减运算

加法运算

C语言指针_空字符串_14
C语言指针_#include_15

2) 减法运算

C语言指针_数组名_16
C语言指针_数组名_17

4.指针数组

C语言指针_指针变量_18

四、多级指针

C语言指针_c语言_19

五、指针和函数

1.函数形参改变实参的值

#include <stdio.h>

void swap1(int x, int y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
	printf("x = %d, y = %d\n", x, y);
}

void swap2(int *x, int *y)
{
	int tmp;
	tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	int a = 3;
	int b = 5;
	swap1(a, b); //值传递
	printf("a = %d, b = %d\n", a, b);

	a = 3;
	b = 5;
	swap2(&a, &b); //地址传递
	printf("a2 = %d, b2 = %d\n", a, b);

	return 0;
}

2.数组名做函数参数

C语言指针_c语言_20

3.指针做为函数的返回值

C语言指针_c语言_21

七、指针和字符串

1.字符指针

C语言指针_指针变量_22

2.字符指针做函数参数

#include <stdio.h>

void mystrcat(char *dest, const char *src)
{
	int len1 = 0;
	int len2 = 0;
	while (dest[len1])
	{
		len1++;
	}
	while (src[len2])
	{
		len2++;
	}

	int i;
	for (i = 0; i < len2; i++)
	{
		dest[len1 + i] = src[i];
	}
}

int main()
{
	char dst[100] = "hello mike";
	char src[] = "123456";
	
	mystrcat(dst, src);
	printf("dst = %s\n", dst);

	return 0;
}

3.const修饰的指针变量

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

int main(void)
{
	//const修饰一个变量为只读
	const int a = 10;
	//a = 100; //err

	//指针变量, 指针指向的内存, 2个不同概念
	char buf[] = "aklgjdlsgjlkds";

	//从左往右看,跳过类型,看修饰哪个字符
	//如果是*, 说明指针指向的内存不能改变
	//如果是指针变量,说明指针的指向不能改变,指针的值不能修改
	const char *p = buf;
	// 等价于上面 char const *p1 = buf;
	//p[1] = '2'; //err
	p = "agdlsjaglkdsajgl"; //ok

	char * const p2 = buf;
	p2[1] = '3';
	//p2 = "salkjgldsjaglk"; //err

	//p3为只读,指向不能变,指向的内存也不能变
	const char * const p3 = buf;

	return 0;
}

4.指针数组做为main函数的形参

C语言指针_数组名_23

5.项目开发常用字符串应用模型

strstr中的while和do-while模型

C语言指针_c语言_24
C语言指针_数组名_25

两头堵模型

求非空字符串元素的个数:

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

int fun(char *p, int *n)
{
	if (p == NULL || n == NULL)
	{
		return -1;
	}

	int begin = 0;
	int end = strlen(p) - 1;

	//从左边开始
	//如果当前字符为空,而且没有结束
	while (p[begin] == ' ' && p[begin] != 0)
	{
		begin++; //位置从右移动一位
	}

	//从右往左移动
	while (p[end] == ' ' && end > 0)
	{
		end--; //往左移动
	}

	if (end == 0)
	{
		return -2;
	}

	//非空元素个数
	*n = end - begin + 1;

	return 0;
}

int main(void)
{
	char *p = "      abcddsgadsgefg      ";
	int ret = 0;
	int n = 0;

	ret = fun(p, &n);
	if (ret != 0)
	{
		return ret;
	}
	printf("非空字符串元素个数:%d\n", n);

	return 0;
}

字符串反转模型(逆置)

C语言指针_#include_26

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

int inverse(char *p)
{
	if (p == NULL)
	{
		return -1;
	}
	char *str = p;
	int begin = 0;
	int end = strlen(str) - 1;
	char tmp;

	while (begin < end)
	{
		//交换元素
		tmp = str[begin];
		str[begin] = str[end];
		str[end] = tmp;

		begin++;  //往右移动位置
		end--;	    //往左移动位置
	}

	return 0;
}

int main(void)
{
	//char *str = "abcdefg"; //文件常量区,内容不允许修改
	char str[] = "abcdef";

	int ret = inverse(str);
	if (ret != 0)
	{
		return ret;
	}

	printf("str ========== %s\n", str);
	return 0;
}

6.字符串处理函数

C语言指针_#include_27
C语言指针_空字符串_28
C语言指针_#include_29
C语言指针_空字符串_30
C语言指针_数组名_31
C语言指针_空字符串_32
C语言指针_#include_33
C语言指针_数组名_34
C语言指针_#include_35
C语言指针_#include_36
C语言指针_空字符串_37
C语言指针_指针变量_38

八、指针小结

C语言指针_空字符串_39