二级指针
指针变量也是一个变量,是变量就需要一个地址,那指针变量的地址存在哪里呢?这就是二级指针。
上面就是二级指针的画图示意,通过二级指针我们其实就可以理解三级指针,四级指针等,但这些就不是特别常用了,作为了解即可。
对于二级指针有以下操作:
- *ppa:通过对ppa进行解引用操纵,这样就可以找到pa。*ppa其实访问的就是pa。
int b =20;
*ppa=&b;//等价于pa=&b
- **ppa:先解引用找到pa再解引用找到a。
**ppa=30;
//等价于*pa=30;
//等价于a=30;
指针数组
指针数组是指针还是数组呢?
我们类比一下,整形数组,是存放整形的数组,字符数组是存放字符的数组。
那么指针数组就是存放指针的数组。这个数组的每一个元素都是一个地址。
指针数组的每个元素是地址,又可以指向一块区域。
指针数组模拟二维数组
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 };
//打印数组
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
arr[i]是访问arr数组的元素,arr[i]找到的是数组元素指向的整形一维数组,arr[i][j]就是整型一维数组中的元素。
上述代码模拟出了二维数组的效果,但实际上,它并非一个完全的二维数组,因为上述代码在存储时并不连续,而二维数组在内存上是一段连续的空间。
字符指针变量
在指针类型中我们知道有一种类型为字符指针char*。
一般使用和整形相似
int main()
{
char ch='w';
char* pc=&ch;
*pc='w';
return 0;
}
字符指针还有一种使用方法
int main()
{
const char* pstr="hello bit";
printf("%s",pstr);
return 0;
}
这里指针pstr其实只存入了hello bit的其实地址,在打印时通过这一个地址找到整个字符串。
在《剑指offer》中有一道相关题目,我们来看一看
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char* str3 = "hello bit.";
const char* str4 = "hello bit.";
if (str1 == str2)
printf("str1 and str2 are same\n");//1
else
printf("str1 and str2 are not same\n");//2
if (str3 == str4)
printf("str3 and str4 are same\n");//1
else
printf("str3 and str4 are not same\n");//2
return 0;
}
在上边的代码中,会有怎样的打印结果呢?
这里的str3和str4指向的是同一个常量字符串。C/C++会把常量字符串存在单独的内存区域,当几个指针指向同一个字符串时,实际上就指向了同一块空间。但是用同样的字符串初始化不同的数组时,就会开辟不同的空间。所以str1与str2不同,str3和str4相同。
今天就先介绍到这里,我们下次再见!