网站建设 拖欠尾款水果建设网站前的市场分析
news/
2025/10/2 10:26:20/
文章来源:
网站建设 拖欠尾款,水果建设网站前的市场分析,手机网站开发软件下载,百度论坛首页指针初阶 1.指针是什么2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1 野指针成因3.2如何避免野指针 4.指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 5.指针和数组6.二级指针7.指针数组 1.指针是什么 指针是什么#xff1f; 指针理解的2个要点#xf… 指针初阶 1.指针是什么2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1 野指针成因3.2如何避免野指针 4.指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 5.指针和数组6.二级指针7.指针数组 1.指针是什么 指针是什么 指针理解的2个要点 指针是内存中一个最小单元的编号也就是地址平时口语中说的指针通常指的是指针变量是用来存放内存地址的变量 (单元编号 地址 C语言中指针) 那我们可以这样理解 内存: 指针变量 我们可以通过取地址操作符取出变量的内存其实地址把地址可以存放到一个变量中这个 变量就是指针变量 int main()
{int a 10;//是向内存中的栈区空间申请4个字节的空间这4个字节用来存放10这个数值int* pa a;//这里我们对变量a取出它的地址可以使用操作符。//a变量占用4个字节的空间这里是将a的4个字节的第一个字节的地址存放在p变量中p就是一个之指针变量。//pa 0x000112233return 0;
}总结 指针变量用来存放地址的变量。存放在指针中的值都被当成地址处理。 那这里的问题是 1.一个小的单元到底是多大1个字节 2.如何编址 经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。 对于32位的机器假设有32根地址线那么假设每根地址线在寻址的时候产生高电平高电压和低电平低电压就是1或者0 那么32根地址线产生的地址就会是 内存被划分为一个个内存单元每个内存单元的大小是1个字节每个字节的内存单元都有一个编号这个编号就是地址地址就是C语言中的指针地址要储存的话放在指针变量中每个内存单元都有唯一的地址来标识在32位机器上地址的大小是4个字节所以指针变量的大小也是4个字节 同理在64位机器上地址的大小是8个字节所以指针变量的大小也是8个字节
2.指针和指针类型 我们看以下代码 int main()
{printf(%d\n, sizeof(char*));printf(%d\n, sizeof(short*));printf(%d\n, sizeof(int*));printf(%d\n, sizeof(double*));
}2.1 指针±整数
代码演示
int main()
{int a 0;int* pa a;char* pc a;printf(%d\n, pa);printf(%d\n, pa1);printf(%d\n, pc);printf(%d\n, pc1);
}运行结果 指针类型是有意义的 指针类型决定了指针1/-1跳过几个字节 char的指针1跳过1个字节 short的指针1跳过2个字节 int的指针1跳过4个字节 double的指针1跳过8个字节 2.2 指针的解引用 指针类型是有意义的 指针类型决定指针解引用时访问几个字节 比如char* 的指针解引用就只能访问一个字节而 int* 的指针的解引用就能访问四个字节。 3.野指针 概念 野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的 3.1 野指针成因 指针未初始化 代码演示 int main()
{int* p;//未初始化*p 20;return 0;
}指针访问越界 代码演示 int main()
{int arr[10] { 0 };int* p arr;int i 0;for (i 0; i 10; i)//指针访问越界{//当指针指向的范围超出数组arr的范围时p就是野指针*p -1;p;}return 0;
}指针指向的空间释放 代码演示 int* test()
{int a 10;//0x0040fe44return a;//地址已返回出函数销毁
}
int main()
{//0x0040fe44int* p test();//p就是野指针printf(%d, p);return 0;
}3.2如何避免野指针 指针初始化 小心指针越界 指针指向空间释放即使置NULL 避免返回局部变量的地址 指针使用之前检查有效性
int main()
{int* p NULL;*p 20;//空指针不允许访问//....if (p ! NULL){//...确保非控指针在使用}return 0;
}4.指针运算
4.1 指针±整数
代码演示1
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };// 0 1 2 3 4 5 6 7 8 9 //是指针打印数组内容int* p arr;int i 0;//p -- arr//p arr//pi arri//*(pi) *(arri) arr[i]//*(arri) arr[i]//*(iarr) i[arr]//[]仅为操作符for (i 0; i 10; i){printf(%d , *(p i));//printf(%d , *(arr i));//printf(%d , arr[i]);//printf(%d , i[arr]);//p指向的是数组首元素//pi是数组下标为i的元素地址//pi起始时跳过i*sizeof(int)个字节}return 0;
}运行结果 代码演示2
#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 指针-指针
案例1
int main()
{int arr[10] { 0 };////指针-指针的前提两个指针指向同一块区域指针类型时相同的//指针-指针差值的绝对值指针和指针之间的元素个数//printf(%d\n, arr[9] - arr[0]);printf(%d\n, arr[0] - arr[9]);return 0;
}运输结果 案例2
//模拟实现strlen
//1.计算器
//2.递归
size_t my_strlen(char* str)
{char* start str;while (*str){str;}return str - start;
}
int main()
{char arr[] abcdef;size_t len my_strlen(arr);printf(%zd\n, len);return 0;
}运输结果
4.3 指针的关系运算
代码演示1
int main()
{float values[N_VALUES];float* vp;for (vp values[N_VALUES]; vp values[0];){*--vp 0;}return 0;
}分析 代码2代码1修改如下
#define N_VALUES 5
int main()
{float values[N_VALUES];float* vp;for (vp values[N_VALUES - 1]; vp values[0]; vp--){*vp 0;}return 0;
}分析 实际在绝大部分的编译器上是可以顺利完成任务的然而我们还是应该避免这样写因为标准并不保证它可行。 标准规定 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。 5.指针和数组
指针就是指针指针变量就是一个变量存放的地址指针变量的大小是4/8数组就是数组可以存放一组数数组的大小取决于元素类型和个数数组的数组名是首元素地址通过一个指针可以访问数组元素
数组名表示数组首元素地址但有两个例外
sizeof数组名数组名单独放在sizeof内部数组名表示整个数组计算的是数组的大小单位是字节数组名数组名表示整个数组取出的事数组的地址数组的地址和数组首元素地址的值是一样的但是类型和意义不同
代码案例1
int main()
{int arr[10] { 0 };printf(%d\n, arr);printf(%d\n, arr1);//printf(%d\n, arr[0]);printf(%d\n, arr[0]1);//printf(%d\n, arr);printf(%d\n, arr1);//printf(%d\n, sizeof(arr));
}代码案例二
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int main()
{int arr[10] { 0 };int* p arr;int i 0;for (i 0; i 10; i){printf(%p%p\n, pi, arri);}return 0;
}运行结果
6.二级指针 指针变量也是变量是变量就有地址那指针变量的地址存放在哪里 这就是 二级指针 。 二级指针变量是存放一级指针变量地址的 代码案例1
int main()
{int a 10;int* pa a;//pa是指针变量一级指针变量int* * ppa pa;//ppa指针变量二级指针变量**ppa 20;//*ppa得出pa--**ppa*paaprintf(%d, a);return 0;
}运行结果
*ppa 通过对ppa中的地址进行解引用这样找到的是 pa *ppa 其实访问的就是 pa**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作 *pa 那找到的是 a .
代码案例2
7.指针数组
指针数组是指针还是数组 是数组。是存放指针的数组。 数组我们已经知道整形数组字符数组。 int arr1[5]; char arr2[5] 指针数组 int* arr3[5]; 代码案例
int main()
{int arr1[] { 1,2,3,4,5 };int arr2[] { 1,2,3,4,5 };int arr3[] { 1,2,3,4,5 };int* arr[] { arr1,arr2,arr3 };int i 0;for (i 0; i 3; i){int j 0;for (j 0; j 5; j){printf(%d, arr[i][j]);}printf(\n);}return 0;
}运行结果
不知不觉指针初阶以告一段落。通读全文的你肯定收获满满让我们继续为C语言学习共同奋进。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924789.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!