目录
在初学指针的时候你是否也常常分不清楚 ’指针数组‘ 和 ’数组指针‘ 呢?
结果是指针数组是数组,数组指针是指针,那快来学习一下这篇好文,更深刻的了解吧
前面初阶指针中学习了一下指针的基本概念:
1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
4. 指针的运算
http://t.csdn.cn/wsHNl
1.字符指针
1.1字符指针定义
在指针类型中我们知道一种指针类型为:char*
一般情况就是存放字符变量地址的指针
int main() { char a = 'w'; char* pc = &a; return 0; }
除去存放字符变量地址这个用法外还有其他的用法:
首先知道字符串常量:一对双引号括起来的字符序列
int main() { const char* pc = "abcdef"; //字符串"abcdef"是常量,不可被修改所以加上const修饰 printf("%c\n", *pc); // 'a' printf("%s\n", pc); // "abcdef" return 0; }
这么一串代码字符指针pc存放的是字符串"abcdef"的首元素地址,所以如果打印一个字符:解引用pc打印结果就是字符串的首元素‘a’,知道了首元素既可通过字符指针pc打印字符串
1.2 字符指针用法
字符指针经典面试题:题源《剑指offer》
int main() { char str1[] = "hello world."; char str2[] = "hello world."; const char* str3 = "hello world."; const char* str4 = "hello world."; if (str1 == str2) printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n"); if (str3 == str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0; }
输出结果:
str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。
2.指针数组
2.1 指针数组定义及使用
指针数组是一个存放指针的数组。
int main() { char* pch[5]; // 字符指针数组 int* parr[5];// 整形指针数组 char** ppch[5]; //二级字符指针数组 return 0; }
指针数组用法:将三个一维数组通过指针变成二维数组并输出打印
int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 2,3,4,5,6 }; int arr3[] = { 3,4,5,6,7 }; int* arr[] = { arr1,arr2,arr3 };//定义一个指针数组存放arr1、2、3,的首元素地址 int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 5; j++) { // *(arr[i]+j)=arr[i][j] 通过i分别找出arr1、2、3并通过j找出所对于的数 printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
3.数组指针
3.1 数组指针定义
数组指针是指向数组的指针
数组指针表示形式:
int main() { int arr[10] = { 0 }; int(*p)[10] = &arr;//取出的arr数组的地址 // 取出arr的地址,元素个数10,每个元素类型为int return 0; }