C语言—指针变量学习(进阶版)

本文详细介绍了指针的本质、类型、野指针的产生、指针运算(加减和指针与数组的关系)、二级指针以及如何使用指针实现字符串逆序。
摘要由CSDN通过智能技术生成

1.指针本质

通常所说的指针变量就是用来存放内存单元地址的变量(唯一标识)

内存单元的编号称为地址,地址也叫指针

指针就是内存单元的编号

1
2
3
4

int a = 9;

int* p = &a;

*pa = 0;

指针大小:                                    

32位机器:4个字节

64位机器:8个字节

2.指针和指针类型

结论1:指针类型决定了指针在被解引用的时候访问几个字节

int *:解引用访问4个字节

char*:解引用访问1个字节

......

结论2:指针的类型决定了指针加1或减一的时候跳过几个字节,也就是决定了指针的步长

int *pa:访问4个字节

pa + 1:跳过4个字节

char *pa:访问1个字节

pa + 1:跳过1个字节

3.野指针

概念:指针指向的位置是不可知的

成因:指针未初始化

Int* p;//一个局部变量不初始化,放的是随机值

*p = 10;//

int main()

        int arr[10] = {0};

        int* p = arr;//&arr[0],指针首地址

        int i = 0;

        for(i = 0;i < 10;i++)//依次访问数组的10个空间

        {

                *p = i;

                p++;

                //*(p + i) = 1

                //*p = 1; p++;

                //两种写法效果相同,给数组空间

        }

        return 0;

}

int* p = NULL;//野指针

*p = 100;//非法赋值

正确用法:
if(p != NULL)

{

        *p = 100;

}

4.指针运算

(1)指针 + 指针

int arr[10];

int *p;

for(p = &arr[1]; p < &arr[10])

{

        *p += 0;//从第二个数组空间开始到第几9个,赋值为0;

}

        int arr[10] = {0};

        int sz = sizeof(arr) / sizeof(arr[0]);

        int* p = arr;

        int i = 0;

        for(i = 0; i < sz)

            //*(p + i) = 1;

             *p = 1;

               p++;

             //两种写法效果相同,都是给数组空间赋值1;

(1)指针 - 指针

int arr[10] = {0};

printf("%d\n",&arr[9] - &arr[0]);

//打印结果为:9

结论:指针 - 指针得到的是指针和指针之间的元素个数

不是所有的指针都能相减

5.指针和数组

(1)数组通过指针访问

int arr[10]  = {0};

int* p = arr;

int sz = sizeof(arr) / sizeof(arr[0]);

int i = 0;

for(i = 0;i < sz;i++)

{

        printf("%d",*(p + i));//解引用

}

取地址方式:&arr[i]   p+i;相同

arr[i] 与 *(arr + i)相同

6.二级指针

int a = 10;

int* pa = &a;//此处的p是一个一级指针

*pa = 20; 

int** ppa = &pa;//paa为二级指针变量,

7.相关题目

1.字符串逆序:

如输入:l like beijing.

输出:bejing.like i

void reversr(char* left, char* right)
{
	assert(left);
	assert(right);

	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}

}

int main()
{
	char arr[101] = { 0 };
	//输入
	gets(arr);//scanf()读到空格就会停止,所以用gets函数进行读取字符串

	//逆置

	/*int left = 0;
	int right = strlen(arr) - 1;
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}*/
	int len = strlen(arr);
	//逆序整个字符
	reversr(arr,  arr + len -1);//包含了点的下标

	//逆序单词
	char* start = arr;

	while (*start)
	{
		char* end = start;
		while (*end != ' ' && *end != '\0')
		{
			end++;
		}
		reversr(start, end - 1);
		if(*end != '\0')
			end++;
		start = end;
	}

	printf("%s",arr);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值