对于c语言,熟练掌握指针和数组都是非常关键的,而等到你熟练掌握了指针和数组,那么恭喜你,在编程的领域,你已经不算是一名小白了。这时,你不妨寻思寻思,如何将已经学到的知识通过合并延伸出更多的知识?下面,是一些关于指针进阶的内容,他能够将你所学的指针和数组结合起来,发挥出1+1大于2的效果。
首先我们先介绍一种特殊的类型,它能够通过一个指针变量定义一个字符串,这种定义的方法,区别于使用数组存储一个字符串。他的原理是将字符串的首元素的地址保存到指针变量中,后期通过对指针的解引用取得这个字符串的内容,因为字符串的结尾必定为\0结尾,因此,不用担心会导致越界访问,下面举一个例子:
char* a="hello";
是将字符串hello的首元素h的地址传给了指针变量a,后期通过对a的解引用直接得到字符串
printf("%s",*(&a));
值得注意的是,这种方式创建的字符串不能够像使用数组创建字符创一样被修改,这是因为使用此种方法创建的字符串是按照常量字符创的形式被创建的,所以,如果要创建能够被修改的字符串还是使用数组创建吧。
因为这种创建字符串的方式使得字符串带上了常属性,所以,在使用这种方法时,建议在创建之前加上const修饰这个指针,或是用注释标明他不可修改,否则在其他人使用你的代码时或是之后你自己翻阅这个代码时,可能会疑惑为什么编译器会在这个地方报错。
const char* a="hello";
指针数组
这时候进入正题,介绍我们今天的两个主角之一的“指针数组”,“指针数组”顾名思义就是一个数组,但是他是用来存放指针的数组。
小伙伴可能会疑惑,指针数组有什么实际的作用呢?下面为大家准备了一个例子:
int main()
{
int arr1[] = { 1,2,3,4,5 };//创建数组arr1
int arr2[] = { 2,3,4,5,6 };//创建数组arr2
int arr3[] = { 3,4,5,6,7 };//创建数组arr3
int* a[] = { arr1,arr2,arr3 };//创建指针数组,数组中的每个元素是上面创建好的数组的数组名,由
int i = 0; 于数组名代表的就是数组首元素的地址,因此可以这个指针数组的三
int j = 0; 个元素就是上面每个数组的首元素的地址。
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d", *(a[i] + j));
}
printf("\n");
}
return 0;
}
使用指针数组,将已经创建好的数组的首元素的地址存放起来,这样就可以只通过对一个数组的 *** 作来支配多个数组,就像上面演示的,只通过 *** 作指针数组这一个数组,就打印出了arr1,arr2,arr3,三个数组的所有元素。
数组指针
下面开始将今天的重难点,为什么呢?因为数组指针毕竟是指针,而指针数组仅仅是数组。
数组指针,顾名思义是一个指针,他是指向数组的指针。举个例子:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int (*parr)[10]=&arr;
上面演示了创建了一个数组,创建了一个数组指针,给数组指针赋予数组所有元素的地址(&数组名取出的是数组所有元素的地址)。
有小伙伴可能会疑惑为什么要使用括号将*和变量名括起来呢?这是因为优先级的原因,如果不将*和变量名括起来,变量名就会先和下标引用 *** 作符‘[ ]’结合,得到一个数组,这样就会使得上述的存放数组的指针变为存放int*类型的数组:int* parr[10];
那么我们详细讲讲int (*parr)[10]=&arr;这个数组指针,首先*和parr结合成为一个指针,然后他和[10]结合变成一个数组指针,数组指针指向的地址是数组arr的地址,而在这个地址处存放的数组的每个元素都是int类型,因此在(*parr)[10]前面加上类型名。
同理我们还可以写一个指向存放的元素为浮点类型指针的数组的数组指针:
double* d[5];
double* (*pd)[5]=&d;
数组指针的使用
数组指针一般用于二维数组,在一位数组中的使用反而会变繁琐,例如:
可以将二维数组的每一行看作一维数组的每一个元素,因此,在二维数组的传参中,传二维数组的数组名传到函数中的是第一行元素的地址,通过 *** 作此特性,可以间接访问二维数组的其他行。
在接收二维数组时,可以用数组名的方式接收亦可以用数组指针的方式接受
例如:
void print(int(*parr)[],int r,int c)
{
intt i=0;
int j=0;
for(i=0;i { for(j=0;j { printf(“%d”,*(*(p+i)+j)); } } } int main() { int arr[3][5]={{1,2,3};{4,5,6};{7,8,9}}; print(arr,3,5); return 0; } 传参传过来的是二维数组的第一行,*(parr+i)表示访问的是第i+1行,(*(parr+i)+j)表示访问的是第i+1行的下标为j的元素的地址,通过添加解引用 *** 作符就可以得到在此地址出存储的元素,即:*(*(parr+i)+j)。 总的来说,指针数组比较好理解一些,数组指针还是要亲自动手尝试一番才能够掌握,所以各位小伙伴在看完这篇博客之后,一定要亲自写几个例子调试调试。 最后,感谢各位小伙伴的观看,祝愿每一个努力向上的人都一帆风顺。如果这一篇博客有帮助到你的学习,还请点赞转发支持一下,谢谢!!! 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)