【C语言指针】 指针+

您所在的位置:网站首页 c语言传入数组指针 【C语言指针】 指针+

【C语言指针】 指针+

2024-02-29 13:14| 来源: 网络整理| 查看: 265

目录 一、指针1、指针是什么1.1、一个单元1个字节 2、指针和指针类型2.1、指针类型的意义① 解引用② + -整数例:把每个整形里放1每个字节里放1总结: 3、野指针3.1、野指针成因① 指针未初始化② 指针越界访问③ 指针指向的空间释放 3.2、如何规避野指针 二、指针运算1、指针+-整数1.1、把数组每个元素赋成01.2、指针大小 2、指针-指针指针-指针 得到的数字的绝对值是指针和指针之间元素的个数指针-指针求元素个数 3、指针的运算关系代码1 从后往前改代码2 从前往后改总结 三、指针和数组1、数组和指针的区别:2、数组名2.1、数组名地址 数组地址 四、二级指针1、什么是二级指针2、二级指针的运算 两层解引用 五、指针数组1、指针数组指针还是数组-数组2、地址解引用 六、结构体1、结构体的声明结构的基础知识结构的声明 2、结构成员的类型3、结构体变量的定义和初始化3.1、创建结构体类型变量3.2、结构体类型重命名-typedef3.3、初始化3.3.1、结构体嵌套初始化 4、结构体成员的访问5、、结构体传参传值 / 传址结论

一、指针 1、指针是什么

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向 (points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以 说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址 的内存单元

地址指向了一个确定的内存空间,所以地址形象地被称为指针int* pa = &a; pa是用来存放地址(指针),所以pa是指针变量

总结: 指针是个变量,用来存放内存单眼的地址。(存放在指针中的值都被当成地址处理)。

1.1、一个单元1个字节

问题: 一个小的单元到底是多大?(1个字节) 如何编址?

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或者0) 产生的二进制序列有2^32 这样的二进制序列,如果作为内存单元的编号,2^32次方个地址,能够管理2的32次方个内存单元 //bit //byte //kb //mb //gb //tb //pb… 2^32bit -> 4,294,967,296 ->/8/1034/1024/1024 ->0.5gb

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储, 所以一个指针变量的大小就应该是4个字节。 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

2、指针和指针类型 2.1、指针类型的意义

32位 指针变量大小都是4字节 为什么还要有这么多指针类型?

① 解引用

指针类型的意义1: 指针类型决定了指针解引用操作的时候,一次访问几个字节(访问内存大的大小) char* 指针解引用访问1个字节 int* 指针解引用访问4个字节

int main() { int a = 0x11223344; //8个二进制位是1字节 //int* pa = &a; //*pa = 0; //改了4字节 (调试在内存中看) char* pc = &a; *pc = 0; //只改了1字节 return 0; } ② + -整数

指针类型的意义2: 指针类型决定了,指针+ -整数的时候的步长(指针±整数的时候,跳过了几个字节) int* 指针+1 跳过了4个字节 char* 指针+1 跳过了1个字节

例:把每个整形里放1 int main() { int arr[10] = { 0 }; //40字节 int* p = arr; // arr数组名表示首元素地址 &arr[0] - int* int i = 0; for (i = 0; i s.d, pt->name, pt->num); //结构体变量本身用.找 //结构体指针用-> 当找到它的成员s是结构体变量时,用.找成员a return 0; } 5、、结构体传参 传值 / 传址 struct S { int arr[100]; int num; char ch; double d; }; //结构体传参 void print1(struct S ss) //传值调用 { printf("%d %d %d %d %c %lf", ss.arr[0], ss.arr[1], ss.arr[2], ss.num, ss.ch, ss.d); } //结构体地址传参 void print2(struct S* ps) { printf("%d %d %d %d %c %lf", ps->arr[0], ps->arr[1], ps->arr[2], ps->num, ps->ch, ps->d); } int main() { struct S s = { {1,2,3,4,5}, 100, 'w', 3.14 }; print1(s); //传结构体 print2(&s); //传地址 4个字节 //只传了地址 减少空间浪费 传参压力减小 return 0; }

首选print2 函数传参的时候,参数是需要压栈的 函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大, 参数压栈的系统开销比较大,所以会导致性能的下降。

结论 int Add(int x, int y) { int z = 0; z = x + y; return z; } int main() { int a = 10; int b = 20; int c = 0; c = Add(a, b); return 0; }

形参x y是在传参的瞬间开辟空间 栈区先使用高地址空间再使用低地址空间

在这里插入图片描述

结论: 结构体传参的时候,要传结构体的地址



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3