当前位置: 首页 > news >正文

c语言(持续更新)

目录

数组与指针

数组指针

指针数组

函数指针

函数指针数组

const和指针

sizeof和指针和数组

strlen和字符数组


数组与指针

数组指针

数组指针本质还是指针

int*p1[10]

int(*p1)[10]

第一个是指针数组,第二个是数组指针,

 解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合

若是二维数组int arr[3][5];

int(*p1)[10]中*p指向数组中第一个元素的地址,及&arr[0],他内部又有5个连续空间构成一维数组。

*(*p+i)*(*(p+i))区别

*(*p+i)访问第一个一维数组的第i下标元素

*(*(p+i))访问第i个一维数组的首元素

指针数组

本质:数组元素均为指针的数组。
定义: 数据类型 *数组名[长度] ,如 int *p[3]; (3个int指针)。
作用:存储多个地址(如变量、数组、字符串地址),便于批量操作。
例: char *strs[] = {"a", "b"}; (指针数组存储字符串常量地址)。
与数组指针区别:先算 [] (数组),元素是指针。

函数指针

- 本质:指向函数的指针变量,存储函数的入口地址。
- 定义格式: 数据类型 (*指针名)(参数类型列表) 
例: int (*ptr)(int, int); (指向返回值为 int 、参数为 int,int 的函数)。
- 赋值:指针名 = 函数名(无需取地址符 & )

int add(int a, int b) { return a+b; }  
ptr = add;  // 或 ptr = &add;(可选) 

 
 
- 调用: (*指针名)(参数)  或  指针名(参数) 

int result = (*ptr)(3, 5);  // 或 ptr(3,5);  

- 用途
- 回调函数:作为参数传入其他函数,实现灵活逻辑(如排序函数的比较规则)。
- 函数跳转表:通过数组存储多个函数指针,根据条件调用不同函数。
 

int (*funcs[])(int) = {func1, func2, func3};  
int res = funcs[1](10);  // 调用func2  


 
- 与指针函数区别
- 函数指针: (*ptr)() ,先算 *ptr (指针解引用),再算 () (函数调用),即指向函数的指针。
- 指针函数: ptr() ,先算 () (函数调用),再算 * (返回指针),即返回值为指针的函数。

函数指针数组


- 本质:数组元素为函数指针,存多个函数入口地址。
- 定义: 数据类型 (*数组名[长度])(参数列表) ,如 int (*fp[2])(int,int); 
- 初始化:直接赋值函数名(如 fp[0]=add; )。
- 调用: 数组名[i](参数)  或  (*数组名[i])(参数) 。
- 用途:函数调度表、替代条件判断,提升代码灵活性。

const和指针

sizeof和指针和数组

//一维数组int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));//字符数组char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));//二维数组int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

strlen和字符数组

//字符数组char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

笔试题

笔试题1
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;
}
//程序的结果是什么?笔试题2
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{int Num;char *pcName;short sDate;char cha[2];short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}笔试题3
intmain()
{inta[4] = { 1, 2, 3, 4 };int*ptr1= (int*)(&a+1);int*ptr2= (int*)((int)a+1);printf( "%x,%x", ptr1[-1], *ptr2);    return0;
}笔试题4
#include <stdio.h>
intmain()
{inta[3][2] = { (0, 1), (2, 3), (4, 5) };    int*p;p=a[0];printf( "%d", p[0]);return0;
}笔试题5
int main()
{inta[5][5];int(*p)[4];p=a;printf( "%p,%d\n", &p[4][2] -&a[4][2], &p[4][2] -&a[4][2]);    return0;
}笔试题6
int main()
{intaa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    int*ptr1= (int*)(&aa+1);int*ptr2= (int*)(*(aa+1));printf( "%d,%d", *(ptr1-1), *(ptr2-1));return0;
}笔试题7
int main()
{char*c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp=cp;printf("%s\n", **++cpp);printf("%s\n", *--*++cpp+3);printf("%s\n", *cpp[-2]+3);printf("%s\n", cpp[-1][-1]+1);return0;
}笔试题8
int main()
{char*c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp=cp;printf("%s\n", **++cpp);printf("%s\n", *--*++cpp+3);printf("%s\n", *cpp[-2]+3);printf("%s\n", cpp[-1][-1]+1);return0;
}

相关文章:

  • 使用DataX同步MySQL数据
  • OSPF域内路由
  • matlab时序预测并绘制预测值和真实值对比曲线
  • 6.9本日总结
  • DPC密度峰值聚类
  • PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
  • 卷积神经网络设计指南:从理论到实践的经验总结
  • CppCon 2015 学习:STL Algorithms in Action
  • CppCon 2015 学习:Transducers, from Clojure to C++
  • 时间同步技术在电力系统中的应用
  • 【习题】DevEco Studio的使用
  • 驭码 CodeRider 2.0 产品体验:智能研发的革新之旅
  • 用递归算法解锁「子集」问题 —— LeetCode 78题解析
  • 蓝桥杯 冶炼金属
  • 基于matlab策略迭代和值迭代法的动态规划
  • ubuntu清理垃圾
  • MySQL-事务(TRANSACTION-ACID)管理
  • Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
  • 数字ic后端设计从入门到精通6(含fusion compiler, tcl教学)repeater详解
  • 总结input标签的各种类型
  • 做网站后台维护的岗位叫什么/网络营销专业是干嘛的
  • 如何给一个公司做网站/搜索引擎营销经典案例
  • b站怎么付费推广自己的视频/微营销平台
  • iis 网站无法访问/电脑培训网上免费课程
  • 免费试用网站空间/近一周热点新闻
  • 做网站用什么系统好/广州代运营公司有哪些