一、 补充
int a[10] = {0};
int *p;
p = a;
printf("%lu\n",sizeof(p));
printf("%lu\n",sizeof(a));
注意:sizeof()中,()后既可以填变量名也可以填类型名;编译器在编译时,会将变量名换成类型名
如: sizeof(int *) sizeof(int [10])
二、字符型指针
- 与指向数组元素的指针类似
2.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;// 编译报错
- const关键字能加就加,加了一定比不加好
- 示例1:编写strcpy
- 示例2:实现strcat
- 两者优化:
2.2 字符串函数
2.2.1 strncpy
一般形式:char *strncpy(char *dest, const char *src, size_t n);
只复制源中的前n个字符,但遇'\0'结束
2.2.2 strncat
一般形式:char *strncat(char *dest, const char *src, size_t n);
只拷贝源中的前n个字符,但遇'\0'结束
2.2.3 strcmp
2.2.4 strncmp
一般形式:char *strncat(char *dest, const char *src, size_t n);
只比较源中的前n个字符,但遇'\0'结束
2.3 万能指针 void *
- 可以接收任何指针的地址
- 不能作为指针来进行指针运算
- 用于强转
- 用于设计者不知道用什么类型的地方
- 可以降低程序的耦合性
void *Memcpy(void *dest, const void *src, size_t n)
2.4 例题
编写程序在一个字符串中查找某个字串首次出现的位置, int subString(const char *s, const char *sub);
三、 指向数组的指针
- 可以指向整个数组
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int (*p)[10]; // p是指向一维数组的指针
p = &a;
- 主要用于二维数组
- 区分:
以a[3][4] = {0};为例
1. &a //int (*)[3][4] //指向数组的指针
2. a <=> &a[0] //指向数组的指针,类型名为int (*)[4]
3. a[0] <=> &a[0][0] //类型名为,int *
- 例1: 用指向数组的指针作为函数的参数,编写程序计算某二维数组所有边上元素的和。