C语言指针初始

目录

1. 指针的定义

2. 指针和指针类型 

2.1  指针 +- 整数

2.2  指针的解引用

 ​编辑

3. 野指针

3.1  野指针的成因

1. 指针位初始化

 2. 指针越界访问

 3.2 如何规避野指针

 4. 指针运算

4.1 指针 +- 整数

 4.2 指针 - 指针

4.3 指针的关系运算

5. 指针和数组

 6. 二级指针

 7. 指针数组


1. 指针的定义

指针是什么?

指针其实就两个要点:

  1. 指针是内存当中一个最小单元的编号,也就是地址
  2. 平时口语中说的,通常指的是指针变量,使用来存放内存地址的变量

总的来说:指针就是地址,口语中说的指针通常指的是指针变量。

 

指针变量

  • 我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到变量中,这个变量就是指针变量。 
#include <stdio.h>

int main()
{
	int a = 10;//在内存开辟一片空间给a
	int* p = &a;//取a的地址,a占用四个字节的空间,
                //将a的四个字节的第一个字节的地址存放到p变量中
				//p 就是一个指针变量
	return 0;
}

 总结:

  • 指针是用来存放地址的,地址是唯一表示一块地址空间的;
  • 指针的大小在32位平台是4个字节,在64位平台是8个字节。

2. 指针和指针类型 

 我们都知道,变量有不同的类型,整形、浮点型等。那指针实际上也是有类型的。

char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

这里可以看到,指针的定义方式是: type + *
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。

2.1  指针 +- 整数

#include <stdio.h>

int main()
{
    int n = 10;
    char* pc = (char*)&n;
    int* pi = &n;
    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    return 0;
}

总的来说,指针的类型决定了指针向前或者向后走一步有多大(距离)。 

2.2  指针的解引用

#include <stdio.h>
int main()
{
	int n = 0x11223344;
	char* pc = (char*)&n;
	int* pi = &n;
	*pc = 0; 
	*pi = 0; 
	return 0;
}

 

总结:
        指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
        比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。 

3. 野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。

3.1  野指针的成因

1. 指针位初始化

#include <stdio.h>
int main()
{
	int* p;//局部变量指针未初始化,默认为随机值
	*p = 20;
	return 0;
}

 2. 指针越界访问

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		//当指针指向的范围超出数组arr的范围时,p就是野指针
		*(p++) = i;
	}
	return 0;
}

 3.2 如何规避野指针

1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

#include <stdio.h>
int main()
{
	int* p = NULL;
	//....
	int a = 10;
	p = &a;
	if (p != NULL)
	{
		*p = 20;
	}
	return 0;
}

 4. 指针运算

  • 指针 +- 整数
  • 指针 - 指针
  • 指针的关系运算

4.1 指针 +- 整数

#include <stdio.h>
#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	//指针+-整数;指针的关系运算
	for (vp = &values[0]; vp < &values[N_VALUES];)
	{
		*vp++ = 0;
	}
	return 0;
}

 4.2 指针 - 指针

int my_strlen(char* s)
{
	char* p = s;
	while (*p != '\0')
		p++;
	return p - s;
}

4.3 指针的关系运算

for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;
}

5. 指针和数组

数组名是数组的首元素地址,两种情况除外:

  • sizeof(数组名)
  • &arr

 arr[1] 相当于 *(arr + 1)。

因此可以用指针来访问数组: 

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int* p = arr; //指针存放数组首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

 6. 二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是 二级指针 。

对于二级指针的运算有:

  • *ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .
int b = 20;
*ppa = &b;//等价于 pa = &b;
  • **ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

 7. 指针数组

  • 指针数组是指针还是数组?
  • 答案:是数组。是存放指针的数组。
  • 数组我们已经知道整形数组,字符数组。
int* arr3[5];

arr3是一个数组,有五个元素,每个元素是一个整形指针。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值