首页 > 其他分享 >C语言——指针(初阶)

C语言——指针(初阶)

时间:2022-10-07 16:32:47浏览次数:63  
标签:初阶 return int C语言 地址 pa main 指针

  • 指针是什么
  • 指针和指针类型
  • 野指针
  • 指针运算
  • 指针和数组
  • 二级指针
  • 指针数组


一.指针是什么

指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。将地址称为指针,即通过它能找到以他为地址的内存单元

注:  内存单元的编号,内存单元的地址 和 指针是一个东西

         指针就是地址,也是一个变量,用来存放地址的变量

         一个内存单元的大小是一个字节,当给其一个编号就是地址

C语言——指针(初阶)_#include


int main()
{
int a = 10;//a占4个字节
int *pa = &a;//拿到的是a的第一个字节的地址
//pa就是一个指针变量
*pa = 20;
}

注意:指针的大小在32位平台是4个字节,64平台是8个字节

二.指针和指针类型

1.指针大小

#include <stdio.h>
int main()
{
char* pa;
short* pc;
float* pe;
printf("%d\n", sizeof(pa));
printf("%d\n", sizeof(pc));
printf("%d\n", sizeof(pe));
return 0;
}
//4 4 4

注意:不管是什么类型的变量,在32位平台大小都是4个字节,64为平台都是8个字节

2.指针类型的意义

(1)指针+-整数

#include <stdio.h>
int main()
{
int a = 0x11223344;
int *pa = &a;//内存中:44332211
*pa = 0;//经过调试查看内存可知,内存中变成 00000000

//char *pa = &a;
//*pa = 0;//经过调试查看内存可知,内存中变成 00332211,后面未变0

return 0;
}
//可知指针类型的不同影响不同


C语言——指针(初阶)_初始化_02

可以看到p和p+1的地址相差4,而pb和pb+1相差1.

C语言——指针(初阶)_数组_03

C语言——指针(初阶)_#include_04

可以看到p和p+2的地址相差8,而pb和pb+2相差2.

总结: 指针类型的不同,操纵地址的增减能力是不同的

                                     指针走一步,能走多远

(2).指针的解引用

下图中展示了内存中char*类型的解引用进行1个字节的1的赋予

C语言——指针(初阶)_初始化_05

下图中展示了内存中int*类型的解引用进行4个字节的1的赋予

C语言——指针(初阶)_初始化_06

指针类型决定了  指针解引用的权限有多大(能操作几个字节

三.野指针

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

(2)成因:

    1.指针未初始化

#include<stdio.h>
int main()
{
int *p;//p是一个局部的指针变量,局部变量不初始化的话,默认是一个随机值
*p = 10;//访问的地址不知道是不是自己的,造成非法访问内存了
return 0;
}

    2.指针越界访问

#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int *p = arr;
int i = 0;
for(i=0;i<=10;i++)//判断为i<=10时会超出范围造成越界
{
*p = i;
p++;
}
return 0;
}

C语言——指针(初阶)_初始化_07

    3.指针指向的空间释放

   

#include<stdio.h>
int* test()
{
int a = 10;
return &a;
}//当返回后,a的地址就已经返回给操作系统了
//但返回后程序会记住这个地址,但已经不属于我们了,此时访问是非法的
int main()
{
int*p = test();//导致野指针的出现
*p = 20;
return 0;
}

注意:如何规避野指针

     1.指针初始化        2.小心指针越界   3.指针指向空间释放及时 置NULL

     4.指针使用之前检查有效性

int main()
{
//当不知道要给p初始化什么值时,直接初始化为NULL
int *p = NULL;

//c语言本身是不会检查数据的越界行为的

//指针使用之前检查有效性
int *p = NULL
*p = 10;//访问NULL时,这个地址是不属于我们的

return 0;
}


四.指针运算

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;
}

2.指针-指针(得到的是两个指针之间的元素个数

前提:两个指针指向同一块空间

#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",&arr[9]-&arr[0]);

//char b[5];
//printf("%d\n",&arr[9]-&b[0]);//这种是错误的
//两个指针相减必须指向同一块空间
}
//结果:9

应用:计算字符串长度

#include<stdio.h>
#include <string.h>
int my_strlen(char* str)
{
char* start = str;
while (*str != '\0')
{
str++;
}
return str - start;//指针-指针
}
int main()
{
int len = my_strlen("hxdlq");
printf("%d\n", len);
return 0;
}

注意:指针+指针是无意义的

3.指针的关系运算

//与后比
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
//与前比
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) {
*vp = 0; }

C语言中标准规定指向数组元素的指针与后面的想比,不能与前面的比较


五.指针与数组

                数组名是数组首元素的地址

C语言——指针(初阶)_初始化_08


六.二级指针

#include<stdio.h>
int main()
{
int a = 0;
int* pa = &a;//pa是指针变量,一级指针

int** ppa = &pa;//二级指针,存放指针变量的地址
//pa也是个变量,&pa是取出存在pa中的地址

printf("%d",**ppa);
return 0;
}

七.指针数组

#include<stdio.h>
int main()
{
int arr[10];//整形数组
char ch[7];//字符数组
//指针数组——存放指针的数组
int* parr[5];//整形指针数组
char* pch[5];//字符指针数组

return 0;
}

标签:初阶,return,int,C语言,地址,pa,main,指针
From: https://blog.51cto.com/u_15722538/5734581

相关文章

  • 初学C语言笔记221007
    鹏哥花了点时间教大家投资fread返回值是真实读到的元素个数while(fread(&s,sizeof(structS),1,fp){//}课后扩展mySQLfseekftellintpos=ftell(fp); //文件指针相对......
  • C语言每日一题——第十天
    第十天随着对指针了解的深入,小明决定进一步尝试指针的使用。他写出一个程序,用于判断给定数组内最长连续字母串的长度。运行:main.exeabcdefea输出:6解释:ab......
  • 深入掌握智能指针
    智能指针介绍学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭......
  • 【我开了C语言的金手指】二.函数(1)
    (一)函数的定义 是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定的任务,相较于其它的代码,具备相对独立性。 一般会有输入参数并有返回值,提供对过......
  • [C语言]CLion Recommends to use 'strtof' instand of 'scanf'
    #include<stdio.h>intmain(){floatOilConsumption;printf("PleaseentertheFuelConsumption:\n");scanf("%f",&OilConsumption);printf("Fu......
  • LeetCode138 复制带随机指针的链表
     idea: 刚开始没有思路,被题目弄懵了,我能想到的方法就是先复制不带random指针的链表,之后由表头到表尾再将每个结点的random指针通过循环进行连接,时间复杂度肯定时很高......
  • C语言学习记录5
    #每日美图分享#huhufor循环的执行顺序为:初始化——>判断——>最后再调整#include<stdio.h>intmain(){inti=0;for(i=0//初始化;i<10//判断;i++//调整){......
  • 开始学c语言的感受
    刚开始写博文,不知道如何下手。身在宿舍,为了提升自己的写作技巧、打字速度,保持自己的热情以及复习自己所学的知识,在大佬的推荐下,我选择了博客。刚开始听起编程语言的时候,觉得......
  • C语言-逻辑运算符
    i++与++i的区别intmain(intargc,char*argv[]){inti=1; ints=++i; intx=i++; printf("%d,%d,%d",i,s,x); return0;} 答案:“3,2,2”。解析:i......
  • 多种PID算法用C语言来实现
    原文链接:https://blog.csdn.net/Nirvana_Tai/article/details/105409311,随后整理验证,再补充(一)前言  PID算法在工业应用中随处可见。大学期间,想做各类科创也少不了PI......