一、指针的运算
1.1加法
对指针可以进行加法运算,即p + n或者p - n。其结果依旧是一个是一个指针,新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型))个字节。
指针也可以进行自增,即*(p ++)或*(++p)或*++p(单目运算符自右向左运算)。(*p)++ 他表示指针的内容自增,而不是指针本身。
指针之间不能进行加法求和(没意义)。
1.2减法
指针和指针之间可以进行减法运算,但是要保证两种(指针指向的数据类型)一致并且必须指向同一数组,结果为(p1地址 - p2地址) / sizeof(指针类型),即表示两个变量差几个基类型。
二、指针与数组
指针能表示数组主要基于数组的单一性、连续性与有序性。
2.1 空指针
在编程中,空指针 是一个特殊的指针值,表示该指针不指向任何有效的内存地址。它通常用于表示 “无指向”“未初始化” 或 “无效引用” 的状态(NULL)。
指针声明时若未确定指向,通常初始化为空指针,避免成为 “野指针”(指向随机内存的危险指针),空指针避免野指针意外修改重要数据。可通过判断指针是否为空,避免无效操作
2.2 迭代器
数组元素在内存中连续存储,指针可以通过地址偏移实现高效遍历。例如:
int a[] = {1, 2, 3, 4, 5};
int len = sizeof(a) / sizeof(a[0]);
int* i; for (i = a; i < len - 1; i++)
{printf("%d ", *i);
}
// 输出:1 2 3 4 5
2.3 一维数组
(1)遍历
对一维数组完成遍历
void printArray(int *a,int len)
{int i;for(i = 0;i < len;++i){ printf("%d\n", *(a + i));}}int main(void)
{int a[] = {0,1,2,3,4,5,6,7,8,9};int len = sizeof(a) / sizeof(a[0]);printArray(a,a + len - 1);return 0;}
(2)逆序
对一维数组内容完成逆序
void reverse(int *a, int len)
{int i;for(i = 0;i < (len / 2); ++i){int t;t = *(a + i);*(a + i) = *(a + len - i - 1);*(a + len - i - 1) = t;}
}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(a[0]);reverse(a,a + len - 1);return 0;
}
(3)排序(选择排序)
对数组进行选择排序:
void swap(int *a,int *b)
{int t;t = *a;*a = *b;*b = t;
}
void choiceSort(int *a,int len)
{int i,j;for(i = 0;i < len - 1;++i){for(j = i + 1;j < len;++j){if(*(a + i) > *(a + j) ){swap((a + i),(a + j));}}}}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(a[0]);choiceSort(a,a + len - 1);return 0;}
2.4 qsort(快速查找)
下列代码通过“选基准→分区→递归排序子数组”的步骤,实现了快速排序算法,最终将 [begin, end] 区间的元素按升序排列。
void qSort(int *begin,int *end)
{if(begin >= end){return ;}int t = *begin;int *p = begin;int *q = end;while(p < q){while(p < q && *q >= t){--q;}while(p < q && *p <= t){++p;}swap(p,q);}swap(begin,p);qSort(begin,p - 1);qSort(p + 1, end);
}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(*a);qSort(a,a + len - 1);printArray(a,a + len - 1);return 0;
}
2.5 二分查找
int *binaryFind(int *begin, int *end,int n)
{while(begin <= end){int *mid = (end - begin) / 2 + begin;if(*mid > n){end = mid - 1;}else if(*mid < n){begin = mid + 1;}else{return mid;}}return NULL;
}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(*a);choiceSort(a,a + len - 1);int *ret = binaryFind(a,a + len -1,4);if(ret){printf("Found\n");}else{printf("No Found\n");}return 0;
}
2.6 字符型数组
遍历与查找有效字符
void Puts(char *s)
{while(*s != '\0'){putchar(*s);++s;}putchar('\n');
}int Strlen(char *s)
{int counter = 0;while(*s){++s;++counter;}return counter;
}
int main(void)
{char s[] = {"Hello"};//Puts(s + 1);printf("%d\n",Strlen("Hello World!"));return 0;
}