指针和数组
- 数组名称保存的就是数组首元素的地址
- 既然数组名称保存的就是地址, 而指针也是用于保存地址的, 所以指针也可以指向数组
int ages[3] = {1, 3, 5};
int *p = &ages;
- 结论: 如果利用指针保存数组的地址之后, 那么 p = ages = &ages;
// 要求你写出三种访问数组元素的写法
int ages[3] = {1, 3, 5};
printf("ages[0] = %i\n", ages[0]);//1
int *p = ages;
printf("p[0] = %i\n", p[0]);//1
printf("0[p] = %i\n", 0[p]);//1
指针的加减
- 指针可以进行加减法
应用场景: 一般都是用在指针数组中
指针变量+1是加多少, 加的就是指针变量类型占用的字节数
注意点:
- -1操作一般企业开发不会用到
2.只有指针才可以做+1-1操作, 数组名不可以
指针和字符串
- 字符串的本质就是数组, 所以指针也可以指向字符串,这样定义字符串又多了一种方式
定义:
char str1[] = {'x', 'x', 'z', '\0'};
char str2[] = "xxz";
char *str4 = "xxz";
- 利用数组和指针定义字符串的区别
-
存储的位置不同
如果是通过数组定义的字符串, 那么存储在内存的栈中
如果是通过指针定义的字符串, 那么存储在内存的常量区中
-
由于在内存中存储的位置不一样, 所以特性也不一样
如果是通过数组定义的字符串, 我们是可以手动修改
如果是通过指针定义的字符串, 我们不能手动修改
-
由于在内存中存储的位置不一样, 所以特性也不一样
如果是通过数组定义的字符串, 每次定义都会重新开辟存储空间
如果是通过指针定义的字符串, 重复定义不会重新开辟存储空间
字符串数组的第二种形式
- 字符串数组的第二种格式
char *str[] = {
"lnj",
"abc",
"def"
};