首页 > 其他分享 >031 指针学习—引用数组

031 指针学习—引用数组

时间:2024-05-28 22:31:41浏览次数:22  
标签:point 元素 地址 数组 printf 031 指针

目录

1 数组元素的指针

(1)定义

(2)举例

(3)注意事项

2 指针的算术运算

(1)前提

(2)运算规则

(3)举例

[1] p+i

[2] p-i

[3] ++p与p++

[4] --p与p--

[5] p1-p2

(4)注意事项

3 通过指针引用数组元素

(1)引用数组元素方法

(2)举例

例1:输出a[10]数组中的全部元素

例2:通过指针变量输出整型数组a的10个元素

4 用数组名作函数参数

例1:将数组a中n个整数按相反顺序存放

例2:用指针方法对10个整数按由大到小顺序排序

5 通过指针引用多维数组

(1)说明

[1] 多为数组元素的地址

[2] 指向多维数组元素的指针变量

[3] 用指向数组的指针作函数参数

(2)举例

例1:输出二维数组地址和对应的数据...

例2:输出二维数组的有关数据(地址和元素的值)

(3)注意事项

1 数组元素的指针

(1)定义

        所谓数组元素的指针就是数组元素的地址。

(2)举例

代码:

#include <stdio.h>
int main()
{
    int a[10]={1,3,5,8,23,44,67,34,55,670};
    int *a_point;
    a_point=a;         //相当于a_point=&a[0],即把a[0]元素的地址赋给指针变量a_point
    printf("a_point首地址: %d\n",a_point);
    printf("a首地址: %d\n",a);
    printf("a[0]首地址: %d\n",&a[0]);
    
    printf("*a_point值: %d\n",*a_point);
    printf("a[0]值: %d\n",a[0]);
    for (int i = 0; i < 10; i++)
    {
       printf("a[%d]的首地址为: %d \n",i,&a[i]);
    }
    printf("\n********\n");
    a_point=a;  //初始化a_point起始地址
    for (int j = 0; j < 10; j++)
    {
       printf("a_point[%d]的首地址为: %d \n",j,&a_point[j]);
    }
    
    return 0;
} 


/**输出结果**/
a_point首地址: 6421984
a首地址: 6421984
a[0]首地址: 6421984
*a_point值: 1
a[0]值: 1
a[0]的首地址为: 6421984
a[1]的首地址为: 6421988
a[2]的首地址为: 6421992
a[3]的首地址为: 6421996
a[4]的首地址为: 6422000
a[5]的首地址为: 6422004
a[6]的首地址为: 6422008
a[7]的首地址为: 6422012
a[8]的首地址为: 6422016
a[9]的首地址为: 6422020

********
a_point[0]的首地址为: 6421984
a_point[1]的首地址为: 6421988
a_point[2]的首地址为: 6421992
a_point[3]的首地址为: 6421996
a_point[4]的首地址为: 6422000
a_point[5]的首地址为: 6422004
a_point[6]的首地址为: 6422008
a_point[7]的首地址为: 6422012
a_point[8]的首地址为: 6422016
a_point[9]的首地址为: 6422020

说明:

① 程序中的数组名不代表整个数组,只代表数组首元素的地址

#include <stdio.h>

int main()
{
    int *point_b,b[10]={1,3,5,8,23,44,67,34,55,670};
    point_b=b; //程序中的数组名不代表整个数组,只代表数组首元素的地址
    printf("b[0]的地址为: %d\n",&b[0]);
    printf("point_b的地址为: %d\n",point_b);
    printf("&b的地址为: %d\n",&b);
    printf("\nb[10]各个元素起始地址\n");
    for (int i = 0; i < 10; i++)
    {
      printf("b[%d]的地址为: %d\n",i,&b[i]);
    }
    
    return 0;
}


/**输出结果**/
b[0]的地址为: 6421984
point_b的地址为: 6421984
&b的地址为: 6421984

b[10]各个元素起始地址
b[0]的地址为: 6421984
b[1]的地址为: 6421988
b[2]的地址为: 6421992
b[3]的地址为: 6421996
b[4]的地址为: 6422000
b[5]的地址为: 6422004
b[6]的地址为: 6422008
b[7]的地址为: 6422012
b[8]的地址为: 6422016
b[9]的地址为: 6422020

② “p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不 是“把数组 a各元素的值赋给p”

③ 在定义指针变量时可以对它初始化。

/**要求:将a数组首元素(即 a[0])的地址赋给指针变量p(而不是赋给*p)**/
//方法1
int *p=&a[0]; 
//方法2
int *p=a;    
//方法3
int *p; 
p=&a[0];//不应写成*p=&a[0];

(3)注意事项

① 在C语言中,数组名(不包括形参数组名)代表数组中首元素(即序号为0的元素)的地址。

因此,下面两个语句等价

p=&a[0]:;//p的值是 a[0]的地址 
p=a; //p的值是数组a首元素(即a[o])的地址

② 引用数组元素可以用下标法(如 a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。

2 指针的算术运算

(1)前提

                指针已指向一个数组元素时

(2)运算规则

① 加一个整数(用+或+=),如p+1;
② 减一个整数(用-或-=),如p-1;
③ 自加运算,如 p++,++p;
④ 自减运算,如 p--,--p。
⑤ 两个指针相减,如pl—p2(只有p1和p2都指向同一数组中的元素时才有意义)。

(3)举例

[1] p+i

#include <stdio.h>

int main()
{
    int *p,a[10]={1,3,5,8,23,44,67,34,55,670};
    p=a;
    
    printf("\n**a[i]的首地址及储存的数据**\n");
    for (int k = 0; k < 10; k++)
    {
     

标签:point,元素,地址,数组,printf,031,指针
From: https://blog.csdn.net/2301_78461620/article/details/139201998

相关文章

  • 旅行第三天【算法】双指针-----盛最多水的容器
    文章目录一、题目二、算法原理三、编写代码一、题目链接:盛最多水的容器二、算法原理首先,这种题可以用暴力解法(枚举每一种容器的大小情况),但是显然会超时(不用尝试啦,我已经试过啦!)其次还是咱们的主题----->利用双指针来求解下面先附上草稿图容器面积=高度(左......
  • 【LeetCode算法】第88题:合并两个有序数组
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:首次想到的解法:定义一个m+n长度的辅助数组,从头遍历这两个数组,谁小就放进辅助数组中并且对应往后走,最后使用memcpy函数将辅助数组内容拷贝到nums1中。这种解法容易想到,但是空间复杂......
  • 智能指针一些实现分析
    智能指针一些实现分析提供值传递但是指针语义的功能。通过指针占用并且对管理对象,在离开作用域时释放该对象。在使用上还有另外一个很好用的功能,精简了代码复杂度,管理的对象类可以省略以下的函数默认构造函数复制构造函数复制赋值函数比如有一个类Fd用于管理fd,并且拥......
  • 《数组运算》
    描述编写程序,输入10个数n,求出它们的和x以及平均值y并输出。(保留2位小数)输入描述输入共10个数。输出描述输出共2行,第一行输出和,第二行输出平均值。样例输入1 1.25.67.28.99546125.990样例输出1 46.984.70提示对于100%的数据:−100≤n≤100#inclu......
  • 数组中的第K个最大元素
    主管问到这个问题(数组中的第K个最大元素)。我首先答了partition算法时间复杂度O(n)空间复杂度O(1)。主管说不行,要用堆。然后(我回答)用建大根堆,取前k,时间复杂度O(n+klogn)初始化O(n),pop出k个O(klogn),空间复杂度O(k)(使用原数组建堆,pop出k个)。主管说都不行,然后(主管)给了个小根堆的算法......
  • 学习JavaScrip 中常见的6种数组方法
    学习JavaScrip中常见的6种数组方法1.find()方法2.forEach()方法3.join()方法4.map()方法5.reduce()方法6.filter()方法1.find()方法find()方法取得数组中第一个满足回调函数中指定条件的元素。如果没有元素满足条件,这个方法返回undefined。下面的例子能够帮助你......
  • 有序数组的平方
    文章目录有序数组的平方解题思路有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为......
  • leedcode【349】. 两个数组的交集——Java解法
    Problem: 349.两个数组的交集题目思路解题方法复杂度Code效果题目给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2]示例2:输入:nums1=[......
  • c++函数指针
     c/c++函数指针的用法【目录】基本定义c函数指针使用举例c++函数指针使用举例函数指针作为函数参数函数指针作为函数返回值函数指针数组typedef简化函数指针操作 c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);c++函数指针......
  • 数组
    数组1.数组概述数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成;其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标访问它们2.数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法......