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