学习笔记八

跟着鹏哥学编程,拿一个好offer。

今天来总结一下最近学习的指针方面的知识,以方便自己以后回顾。

一.什么是指针?指针就是内存地址。在计算机内存中,我们定义一个变量,计算机就会给该变量分配一个内存空间,这个内存空间可以取出来给指针,如下:

#include <stdio.h>

int main()
{
    int a = 10;//定义一个变量a
    int* pa = &a;//&是一个取地址符,将a的地址取出来赋给指针变量pa
                 //变量pa类型是int*,说明变量pa指向变量类型是int
    return 0;
}

指针类型决定了两件事情:

1.指针类型决定了指针进行解引用操作的时候,能访问空间的大小

#include <stdio.h>

int main()
{
    //NULL(空指针) - 用来初始化指针的,给指针赋值的
    int* a = NULL;//指向整型的指针,能访问的空间大小是4个字节
    char* b = NULL;//指向字符型的指针,能访问的空间大小是1个字节
    double* c = NULL;//指向双精度浮点型的指针,能访问的空间大小是8个字节
    printf("%d\n",sizeof(int*));
    printf("%d\n",sizeof(char*));
    printf("%d\n",sizeof(double*));
}

指针大小都是4或8个字节,在32位平台上是4个字节,在64位平台上就是8个字节。

2.指针类型决定了指针走一步走多远(指针的步长)

#include <stdio.h>
int main()
{
    int a=10;
    int* pa = &a;
    printf("%p\n",pa);
    printf("%p\n",pa+1);

    char str = 'a';
    char* s = &str;
    printf("%p\n",s);
    printf("%p\n",s+1);
    return 0;
}

二.野指针

野指针是指针指向内存空间是未可知的,野指针有三种情况如下:

1.指针未定义

#include <stdio.h>

int main()
{
    //未初始化的指针变量
    int* p;//局部变量不初始化,里边默认放的是一个随机值
    *p = 20;
    return 0;
}

2.指针越界访问

#include <stdio.h>

int main()
{
    int arr[10] = {0};
    int i = 0;
    int* p = arr;
    for(i=0;i<=12;i++)//数组越界导致的野指针
        {
            *p=i;
            p++;
        }
    return 0;
}

3.指针指向空间内存被释放

#include <stdio.h>

int* test()
{
	int a = 10;
	return &a;
}
int main()
{
    int* p = test();
    *p = 20;
    printf("%p\n",p);
    printf("%p",*p);
    return 0;
}

三.指针运算

1.指针加减整数

#include <stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = &arr[9];
	for (i = 0; i < sz; i++)
	{
		printf("%d ",*p);
		p = p-1;
	}
	return 0;
}

2.指针是可以比较大小的

#include <stdio.h>

int main()
{
	int arr[5] = { 0 };
	int* pa = arr;
	for (pa = arr;pa<=&arr[4];)
	{
		*pa = 0;
		pa++;
	}

	for (int i = 0; i < 5; i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

四.二级指针

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;//二级指针  
	printf("%d\n",**ppa);
	return 0;
}
#include <stdio.h>

//指针数组 - 数组 - 存放指针的数组
//数组指针 - 指针

int main()
{
	int a = 10; int b = 15;
	int c = 11;
	int* arr[3] = { &a,&b,&c };//指针数组
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d ",(*arr[i]));
	}
	return 0;
}

目前就学到这些,日后有新东西会更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值