1.动态内存分配
(1)函数的基本用法
malloc(空间大小) 申请内存空间
eg:
int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = malloc(sizeof(a));
free (void *p) 释放空间
注意事项:
①free (NULL) 不会报错
②不能销毁两次相同的指针
③不能进行++运算
eg:
int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = malloc(sizeof(a));
free(q);
realloc (void *p,空间大小) 重新分配内存空间,并且释放之前的空间
eg:
int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = malloc(sizeof(a));
int b[] = {10,11,12,13,14,15};
p=realloc(p, sizeof(a) + sizeof(b));
free(q);
(2)例题
void printArray(int *s, int len)
{
int i;
for(i = 0;i < len;++i)
{
printf("%d\\n",*(s + i));
}
}
int main(void)
{
int n = 10;
int *p = calloc(n, sizeof(int));
int i;
for(i = 0;i < n;++i)
{
*(p + i) = i + 1;
}
printArray(p, n);
p = realloc(p, n * 2 * sizeof(int));
for(i = n;i < n * 2;++i)
{
*(p + i) = i + 1;
}
printArray(p, n * 2);
free(p);
p = NULL;
return 0;
}
2.函数指针
(1)一般形式
数据类型 (*指针变量名)(函数参数列表)
eg:
int (*p)(int, int)
说明:
int (*p)(int int) 表示定义一个指向函数的指针变量p,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。
(*p)的()不能被省略
(2)赋值
在给函数指针变量赋值时,只需给出函数名而不必给出参数。
eg:
p = max;
(3)调用
用函数指针变量调用函数时,只需将(*p)代替函数名即可,在(*p)之后的括号中根据需要写上实参。
eg:
c = (*p)(a, b);
c = p(a, b);
注:两种写法都可以,一般用第二种写法。
(4)例题
遍历数组里面能被5整除的数
#include <stdio.h>
int div3(int n)
{
return n % 3 == 0;
}
int div5(int n)
{
return n % 5 == 0;
}
void printArray(int *a, int len, int (*pfn)(int))
{
int i;
for(i = 0;i < len;++i)
{
if(pfn(a[i]))
{
printf("%d\\n", a[i]);
}
}
}
int main(void)
{
int a[] = {1,-2,3,-4,5,-6,7.-8,9,0};
int len = sizeof(a) / sizeof(*a);
printArray(a, len, div5);
return 0;
}
3.指向指针的指针
(1)一般形式
char **p;
p = &q;
*p是说明p是一个指针,char *是它的基类型。
4.指针数组
(1)一般形式
类型名 *数组名[数组长度]
eg:
int *p[4];
(2)指针数组作为函数参数
指针数组作为函数参数,形参是指向指针的指针。
(3)例题
eg1:找最大的字符串
#include <stdio.h>
#include <string.h>
char *maxStrings(char **p, int len)
{
char *max = p[0];
for(int i = 1;i < len;++i)
{
if(strcmp(max,p[i]) < 0)
{
max = p[i];
}
}
return max;
}
int main(void)
{
char *s[3] = {"Hello", "World", "China"};
int len = sizeof(s) / sizeof(*s);
puts(maxStrings(s, len));
return 0;
}
eg2:对字符串逆序
#include <stdio.h>
void printStrings(char **p, int len)
{
int i;
for(i = 0;i < len;++i)
{
puts(p[i]);
}
}
void reverseStrings(char **p, int len)
{
int i;
for(i = 0;i < len / 2;++i)
{
char *t = p[i];
p[i] = p[len – i – 1];
p[len – i – 1] = t;
}
}
int main(void)
{
char *s[3] = {"Hello", "World", "China"};
int len = sizeof(s) / sizeof(*s);
reverseStrings(s, len);
printStrings(s, len);
return 0;
}
eg3:对字符串进行排序
#include <stdio.h>
#include <string.h>
void SortStrings(char **p, int len)
{
int i, j;
for(i = 0;i < len – 1;++i)
{
for(j = i + 1;j < len;++j)
{
if(strcmp(p[i], p[j]) > 0)
{
char *t = p[i];
p[i] = p[j];
p[j] = t;
}
}
}
}
int main(void)
{
char *s[3] = {"Hello", "World", "China"};
int len = sizeof(s) / sizeof(*s);
SortStrings(s, len);
printStrings(s, len);
return 0;
}
eg4:交换函数
void swapStrings(char **p1, char **p2)
{
char *t = *p1;
*p1 = *p2;
*p2 = t;
}
评论前必须登录!
注册