首页
关于
Search
1
判断月份有几天
15 阅读
2
“熬”的境界
10 阅读
3
永远不要帮别人消耗自己
10 阅读
4
安装WMware报错
10 阅读
5
判断三位水仙花数
5 阅读
默认分类
文章
知识
C语言
全部
登录
Search
Typecho
累计撰写
11
篇文章
累计收到
0
条评论
首页
栏目
默认分类
文章
知识
C语言
全部
页面
关于
搜索到
7
篇与
的结果
2024-12-22
数组
指针指针的定义指针(Pointer)是编程语言中的一个对象,通过地址直接指向内存中该地址的值。由于通过地址能够找到所需的变量存储单元,可以说地址指向该变量存储单元,因此将地址形象化称为"指针"。总而言之,指针就是变量,存放内存单元的地址,存放在指针中的值都会被当作地址处理。类型含义short短整型(2字节)2^16int整型(4字节) 2^32long长整型(8字节)2^64float单精度浮点型(4字节)2^32double双精度浮点型(8字节)2^32char字符型(1字节) 2^8指针类型决定了指针进行解引用操作的时候,能够访问空间的大小。int* p;* p能够访问4个字节char* p;* p能够访问1个字节double* p:* p能够访问8个字节…依照不同变量类型所占字节大小依此类推#include <stdio.h> int main() { int a[] = {1,4,6,9};// 一个普通的整型数组 int *pa;// 一个指针变量,用于存储整型变量a的地址 pa = a;// 将a的地址赋给指针pa printf("pa指向的值: %d\n", *pa);// 输出指针pa指向的变量的值 printf("pa指向的地址: %p\n\n", pa);//pa的指针地址 printf("pa(a+1)的值:%d\n",*(pa+1)); printf("pa指向的地址: %p\n\n", (pa+1)); return 0; }运行结果pa指向的值: 1pa指向的地址: 000000000062FE00pa(a+1)的值:4pa指向的地址: 000000000062FE04因为int类型大小占用四个字节,所以是00到04其他同理指针的意义减少内存拷贝:通过传递指针而不是数据本身,可以避免在函数调用时复制大块的数据,从而节省内存操作的时间。动态内存管理:可以在运行时根据需要分配和释放内存,而不是在编译时确定内存大小,这样可以更高效地利用内存资源。高效的数据结构:指针是实现链表、树、图等动态数据结构的基础,这些数据结构在插入、删除和遍历操作方面比数组更高效。直接内存访问:指针允许直接操作内存地址,这使得数组和字符串处理更高效,因为可以通过指针算术快速遍历和修改元素。ps 简单来说,就是提高程序的效率,避免使用过多的变量,增加程序的压力写一个简单的例子#include<stdio.h> int main() { int arr[]={1,2,3,4,5,6,7,8,9}; int *p; p=arr; printf("这是数组\n"); for(int i=0;i<9;i++) { printf("%d\t",*p); p++; } return 0; } #include <stdio.h> int main() { int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 定义并初始化数组 int i; printf("这是遍历\n"); // 使用for循环遍历数组 for (i = 0; i < 9; i++) { printf("%d\t", arr[i]); // 打印数组的每个元素 } return 0; }明显数组(0.1051秒)的运行速度比遍历(0.1385秒)的快空指针在指针声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。#include <stdio.h> int main(){ int* p = NULL; printf("p的地址是:%p",p); return 0; }运行结果p的地址是:0000000000000000野指针原因1.指针未初始化#include <stdio.h> int main(){ int a; // 局部变量不初始化,默认是随机值 int* p; // 局部指针变量未进行初始化,默认为随机值 *p = 20; return 0; }2.指针越界访问#include <stdio.h> int main(){ int arr[5] = {0}; int* p = arr; for (int i = 0; i <= 5; i++){ // 当i = 5时,指针的范围超出了数组arr的范围时,p就是野指针 *(p++) = i; } return 0; }2.指针指向的空间释放int* test() { int a = 10; return &a; } int main() { int* p = test(); //执行完此语句之后,test函数已经执行完毕,那么a的内存已经被释放了(因为执行了return),下面的解引用操作可能就是对别的项目在该内存地址的值进行赋值,会产生问题。 *p = 20; return 0; }指针的左值和右值左值:可以出现在赋值操作的左侧,有明确的内存地址,可以被修改。右值:不能出现在赋值操作的左侧,通常是表达式的计算结果,是临时值int a = 10;: a是一个左值,因为它是一个变量,有明确的内存地址。int b = 20;: b也是一个左值。int c = a + b;: (a + b)是一个右值,它是表达式的计算结果,是一个临时值。a = c;: a是左值,可以出现在赋值操作的左侧,而c是右值,是赋值操作的右侧。
2024年12月22日
5 阅读
0 评论
0 点赞
2024-11-28
数字取反
#include<stdio.h> int main() { int n,s; printf("输入数字"); scanf("%d",&n); printf("输出"); do { s=n%10; printf("%d",s); n=n/10; } while(n!=0); printf("\n"); }
2024年11月28日
4 阅读
0 评论
0 点赞
2024-11-28
for循环的应用-判断最大公约数
#include<stdio.h> int main() { int m,n,i,min; printf("请输入两个正整数判断最大公约数\n"); scanf("%d%d",&m,&n); //找出最小值 if(m>n) { min=n; } else { min=m; } for(i=min;i>=1;i--) { //找出最大公约数 if(m%i==0&&n%i==0) { printf("最大公约数为%d",i); break; } } return 0; }
2024年11月28日
3 阅读
0 评论
0 点赞
2024-11-27
for循环的嵌套-打印99乘法表
for循环嵌套#include<stdio.h> int main() { int a,b; for(a=1;a<=9;a++) { for(b=1;b<=9;b++) { printf("%d*%d=%d\n",a,b,a*b); } } }
2024年11月27日
5 阅读
0 评论
0 点赞
2024-11-25
for循环的应用-素数判断
1.for循环语句应用for(初始值;判断;语句)#include<stdio.h> int main() { int i,shu,flag=0;//素数判断 printf("请输入一个数:"); scanf("%d",&shu); for(i=2; i<=shu/2; i++) { if(shu%i==0) { flag=1;//标记为非素数,方便后面判断 break; } } if(flag==1) { printf("%不是素数",shu); }else { printf("%d是素数",shu); } return 0; }
2024年11月25日
4 阅读
0 评论
0 点赞
1
2