如何正确使用指针数组?(警醒)

本文深入探讨了指针数组的概念及正确使用方法,通过实例讲解了如何利用指针数组实现数值的最大最小值查找与交换,同时指出了常见错误及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何正确使用指针数组?
程序代码:
#include <stdio.h>
void man(int*a[]);
void exchange(int*x,int*y);
int main()//求输入10个数求最大最小并把最大和最后一个数换最小和第一个数换,其它数的位置不变并输出要求必须用指针;
{
    int*a[10],i;
    int b[10];
        /*
            for(i=0;i!=10;i++)
        scanf("%d",a[i]);
           
*/
    for(i=0;i!=10;i++)//求最大和最小;这里为什么不能直接写成上面注销的那样呢?运行程序时提示程序出错!
    {
        scanf("%d",&b[i]);
            a[i]=&b[i];
    }
      man(a);//这里传递过去的是什么呢?
        for(i=0;i!=10;i++)
        printf("%-4d",*a[i]);
        printf("\n");
return 0;
}
void man(int*a[])//求最大和最小;
{
    int i,*max,*min;
    max=min=a[0];
    for (i=1;i!=10;i++)
    {
        min=a[i]>max?a[i]:max;//这里更是不懂为什么比较地址就能求最大和最小开始写*min=*a[i]>*max?*a[i]:*max;也是不行,后来改成这就行了!
        max=a[i]<min?a[i]:min;//
    }
   exchange(min,a[0]);
   exchange(max,a[9]);
}
void exchange(int*x,int*y)//交换位置;
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}




int*a[10];

楼主其实自己都有怀疑,所以偷巧写成那样,这个其实应该写成:
int* a[10];  (写成int *a[10];也是符合语法的,但会误导自己,以为指向的是int型数据,但编译器不会理解错,是你自己理解错)
表示a是储存10个int*指针的数组,是10个指针,不是10个int数据,所以这些指针全部是没有指向数据实体的,当把a[i]传给scanf()函数,scanf()把这个a[i]里面的指针值视为某个int型数据实体的地址,要对它进行解引用,给那个地址处的内存赋值,由于指针a[i]没有初始化,所以崩溃。

对,在语法上,编译器接受scanf("%d", a[i])这样的编码,但那仅仅是过了语法检查关,并不表示运行也能正确。scanf()需要指针,你就给它指针,但指针指向对不对,编译器是无法检查出来的。

不要把int* i当作定义了一个int数据,这是我反复说过的。有人必然有名片,但有名片不必然就有人,人是数据实体,指针只是名片,名片是可以乱印的。都把指针当神器,但如果不深刻了解,只能是搬起石头砸自己的脚。写出int*a[10]这样的代码,必须自己很清楚那是什么意思,能够怎么用,必须怎么用,搞不清楚,就老老实实地定义int a[10],就如下面int b[10]能用一样。定义指针之后,总得在内存中开辟数据实体,除了数据实体本身占用的内存之外,还附带多了一个指针变量也占用内存的开销,省不了内存(其实按指针寻址是间接寻址,操作是先取指针地址值定位地址然后再取值,步骤比直接寻址多了两步,时间上也不占优),但更容易令你出错。指针用在该用的地方,而且能不用就尽量不用,不要被人误导,总想用指针显威风,没有任何一本编程实用指南指导程序员尽量采用指针。信不信由你,未出校门的人就喜欢中这种毒,将来害死你的时候,不要后悔。

指针,是在程序的实际迫使不得不用,或者能够使代码显得更清晰、表达更自然的时候,应该采用。如果不具备这样的效果,就不要用,哪怕牺牲一点点速度性能,也要优先保证代码的清晰性和可维护性,这才是正确性的保障基础,代码不清晰,连排错都成问题,排错的时间比赢得的那一点点毫秒级的时间多不知几千万倍,论人工按时间摊下来的成本,那么一点速度优势弥补得来吗。做项目的头儿,如果不懂衡量取舍这种综合关系,纯走技术路线,他根本没资格坐这位置,而凡是有这种观念的人,都注定不是做项目头子的料,不管他吹得多牛,一说这种话,就彻底暴露,要么是撒谎,要么是哪个傻瓜老板被南郭先生骗了。

在C语言中,指针数组是两种非常重要的概念,它们有许多相似之处,但也有一些关键的区别。以下是如何正确使用指针数组的详细说明: ### 数组使用 数组是一组相同类型的数据的集合。数组的声明和初始化如下: ```c int arr[5] = {1, 2, 3, 4, 5}; ``` 访问数组元素可以使用下标操作符 `[]`: ```c int firstElement = arr[0]; // 访问第一个元素 ``` 数组名在大多数表达式中会被转换为指向第一个元素的指针。例如: ```c int *ptr = arr; // 等同于 int *ptr = &arr[0]; ``` ### 指针使用 指针是一个变量,其值为另一个变量的地址。指针的声明和初始化如下: ```c int var = 10; int *ptr = &var; // ptr 指向 var 的地址 ``` 访问指针所指向的值使用解引用操作符 `*`: ```c int value = *ptr; // 获取 ptr 指向的值 ``` ### 指针数组的关系 数组名在大多数表达式中会被转换为指向第一个元素的指针。例如: ```c int arr[5] = {1, 2, 3, 4, 5}; int *ptr = arr; // 等同于 int *ptr = &arr[0]; ``` 可以通过指针访问数组元素: ```c int firstElement = *ptr; // 等同于 arr[0] int secondElement = *(ptr + 1); // 等同于 arr[1] ``` ### 示例代码 以下是一个完整的示例,展示了数组指针使用: ```c #include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *ptr = arr; // 指针指向数组的第一个元素 // 访问数组元素 printf("First element: %d\n", arr[0]); printf("Second element: %d\n", arr[1]); // 通过指针访问数组元素 printf("First element: %d\n", *ptr); printf("Second element: %d\n", *(ptr + 1)); // 修改数组元素 arr[0] = 10; *(ptr + 1) = 20; // 验证修改 printf("Modified first element: %d\n", arr[0]); printf("Modified second element: %d\n", arr[1]); return 0; } ``` ### 注意事项 1. **数组名是常量指针**:数组名在大多数表达式中会被转换为指向第一个元素的指针,但它是一个常量指针,不能被修改。 2. **指针运算**:指针可以进行算术运算,如 `ptr + 1`,这会导致指针指向下一个元素。 3. **越界访问**:访问数组元素时,确保索引在有效范围内,否则会导致未定义行为。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值