指针知识大全-------指针类型的意义;什么是野指针,如何避免野指针;指针的正确运算

简介: 指针知识大全-------指针类型的意义;什么是野指针,如何避免野指针;指针的正确运算
#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
//数组名是首元素地址           指针就是地址,指针变量也是指针
//int main()
//{
//    int a = 10;//a占4个字节
//    int*pa=&a;//*说明pa是指针变量,将a的地址放在指针变量pa中,字节是4,int型,拿到的是a的4个字节的第一个字节的地址
//    *pa = 20;//将a改为20
//    return 0;
//}
//int main()
//{
//    int* pa = 0;
//    char* pb = 0;
//    float* pc = 0;
//    printf("%d\n", sizeof(pa));//打印结果都为4,但指针类型都有具体意义
//    printf("%d\n", sizeof(pb));
//    printf("%d\n", sizeof(pc));
//    return 0;
//}
//指针类型的意义:
//1,指针类型决定,指针解引用的权限有多大,(int型4个字节,char型1个字节)
//int main()
//{
//    int a = 0x11223344;//0x表示十六进制,每一位用二进制都用八个二进制表示,如11111111
//    int* pa = &a;//将地址a存放在pa中,pa里面存放的是a的地址
//    *pa = 0;//将pa改为0(4个字节)
//    return 0;
//}
//2.指针类型决定了,指针走一步,能走多远(字节)(指针int型+1--->4个字节  char型+1---->1个字节
//int main()
//{
//    int arr[10] = { 0 };
//    int* pa = arr;//数组名就是首元素地址,将地址拿给指针变量pa
//    char* pc = arr;
//    printf("%p\n", pa);//打印结果为003EF9C4(随机值)
//    printf("%p\n", pa+1);//打印结果为003EF9C8 int型,pa+4
//    printf("%p\n", pc);//打印结果为003EF9C4(随机值)
//    printf("%p\n", pc+1);//打印结果为003EF9C5 char值,pc+1
//    return 0;
//}
//int main()
//{
//    int arr[10] = { 0 };
//    int* p = arr;
//    int i = 0;
//    for (i = 0; i <= 10; i++)
//    {
//        *(p + i) = 1;//p+i其实是下标为i的地址  //把整形元素每一个元素都改为1
//    }
//    return 0;
//}
//野指针:指针指向位置不可知(随机,不正确,没有明确限制)
//野指针成因:
// 
//1.指针未初始化
//int main()   //p是野指针
//{
//    int* p ;//p是局部指针变量,局部变量不初始化,默认是随机值,此时p里面放的是随机值,随即地址
//    *p = 20;//随机地址的空间,可能不是自己的空间!!!!非法访问内存
//    return 0;
//}
//
//2.指针越界访问
//int main()
//{
//    int arr[10] = { 0 };
//    int* p = arr;//此时p指向arr首元素的首地址,下标为0,为p+0;最后一个下标为10,为p+10,越界访问了
//    int i = 0;
//    for (i = 0; i <= 10; i++)//循环11次
//    {
//        *p = i;
//        p++;
//    }
//    return 0;
//}
//
//3.指针指向的空间释放
//int* test()
//{
//    int a = 10;
//    return &a;//返回a的地址
//}
//int main()
//{
//    int* p = test();//将test函数放在指针变量a中,引用test函数,引用完销毁
//    *p = 20;//将指针变量p的值变为20,此时test函数已被引用并销毁
//    return 0;
//}
//如何规避野指针
//1.指针初始化
//int main()
//{      
//    int* a = NULL;//当前不知道p应该初始化为什么地址时,初始化为NULL NULL是0,或者把0强制转换为void型指针
//    int* a;//放的是随机值,不能被使用
//    //应该为   明确知道初始化的值
//    int a = 10;
//    int* pra = &a;
//    printf("a=%d\n", a);
//    return 0;
//}
//2.小心指针越界-----C不会检查的
//3.指针指向空间释放及时置NULL
//4.指针使用之前检查有效性
//int main()
//{
//    int* pa = NULL;
//    //*pa = 10;//不能访问\0,因为\0地址无法被使用,无效被指针变量指向
//    //应为
//    if (*pa!= NULL)
//    {
//        *pa = 10;
//    }//此时要不指向有效空间,要不指向空指针
//    return 0;
// }
//指针运算
//1.指针+-整数
//int main()
//{
//    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//    int* pa = arr;
//    int* pand = arr + 9;
//    while (pa <= pand)
//    {
//        printf("%d\n",*pa);//将pa数组里的数从下标0开始,由低到高,逐个向前打印
//        pa++;//初始化向前一个下标,使满足pa<=pand的每一个都打印(先用,后++)
//    }
//    return 0;
//}
//2.指针-指针    前提:两个指针指向同一个空间  到\0为止
//int main()
//{
//    int arr[10] = { 0 };
//    int* pa = arr;
//    printf("%d\n", &arr[9] - &arr[0]);//打印结果为9  arr[9]是第十个元素10的地址,arr[0]是第一个元素0的地址
//    //但是下面这个是错误的
//    char ch[5];
//    printf("%d\n", &arr[9] - &ch[0]);//该方法错误,因为&arr和&ch不是同一空间
//    return 0;
//}
#include<string.h>
//计数器法实现自创函数my_strlen
//int my_strlen(char* str)//传给my_strlen的是地址,可以用地址接收,返回的是长度,int型
//{
//    int count = 0;//计数器
//    while (*str != 0)
//    {
//        count++;
//        str++;
//    }
//    return count;
//}
//指针-指针法实现my_strlen
int my_strlen(char* str)//创建int型,
{
    char* start = str;//将str指向指针变量str
    while (*str != '\0')
    {
        str++;
    }
    return str - start;
}
int main()
{
    int len = strlen("a,b,c");//strlen---求字符串长度
    printf("%d\n", len);//打印结果为5,因为,也是一个字节
    int lent=my_strlen("a,b,c");//自己创建函数,并打印字符串   字符串a,b,c传参时,传过来的只是a的地址
    printf("%d\n", lent);//打印结果为5
    return 0;
 }


相关文章
|
12月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
151 1
|
12月前
|
人工智能
魔法指针 之 指针变量的意义 指针运算
魔法指针 之 指针变量的意义 指针运算
70 0
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
179 0
|
编译器 C++
函数指针和函数对象不是同一类型怎么替换
函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
88 4
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
119 0
|
图形学 Windows
程序技术好文:记录类型指针
程序技术好文:记录类型指针
72 0
|
JSON Go 数据格式
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(4)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
Java 编译器 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(3)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】