一、字符型指针:
1.1 const的作用:
在指针变量前加const修饰,无法通过该指针去修改指针指向的值。
//情况1:
const int *p;
p = &i;
*p = 100;// 编译报错(指针指向的值不可变)
//情况2:
int const *p;
p = &i;
*p = 100;// 编译报错
//情况3:
int * const p;
p = &i;// 编译报错(指针本身不可变)
*p = 100;
//情况4:
const int * const p;
p = &i;// 编译报错
*p = 100;// 编译报错(两者均不可变)
1.2 示例:
1. 编写strcpy:
2. 编写strcat:
给形参加上const
(如const char *
)之后,函数就能接收字符串字面量了。
3. 编写strcmp:
4. 优化:
将函数的返回值改为地址后,就可以在puts中嵌套调用函数。
1.3 字符串函数:
1.3.1 strncpy:
只复制源中的前n个字符,遇'\0'结束。
1.3.2 strncat:
1.3.3 strncmp:
注意循环条件是--n而不是n--。
1.3.4 万能指针 void *&Memcpy:
二、 二维整形数组与指针:
2.1 指针数组与数组指针:
1、指针数组:即存放指针变量的数组。
int *p[10]; //p[10]为数组, 定义了10个指针变量。
printf("%lu\n",sizeof(p)); //输出结果为80(占80个字节)。
2、数组指针:即指向整个数组的指针。
int (*p)[10]; //一个指向长度为10的一维整型数组的指针。
p = &a; //在指针变量p中保存长度为10的一维整型数组的地址,p与p+1差40个字节。
2.2 区分:
1、表达式a[0]:指针+1(跨4个字节),表达式a: 指针+1(跨16个字节),表达式&a:指针+1(跨48个字节)。
2、a[i][j] <=> *(*(a + i) + j)
三、练习:
1.输出运行结果:
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p = a;//指向a[0]的指针
printf("%d\n", *((int *)(p + 3) - 3));//运行结果为10
2.编写程序在一个字符串中查找某个字串首次出现的位置, int subString(const char *s, const char *sub)。
3.编写程序计算某二维数组所有边上元素的和。