数组与指针(三)

习题:编写一个对数组进行操作的函数,目的用此函数返回数组内所有元素的和

方法一:   知道固定数组个数

<pre name="code" class="objc"><span style="font-size:18px;">#include<stdio.h>
int sum(int *ar);
int main()
{   int total;
	int numbers[5]={3,4,2,6,1};

     printf("%d ",numbers)

    total=sum(numbers) ;
	printf("%d\n",total);

}
int sum(int *ar)
{
   int i;
   int total=0;
   for(i=0;i<5;i++)
	   total+=ar[i];
    return total;

}</span>


方法二:   不知道固定的个数

<span style="font-size:18px;">#include<stdio.h>
int sum(int *ar,int n);
int main()
{   int total,n;
	int numbers[]={3,4,2,6,1,8};
    n=sizeof(numbers)/sizeof(int);
    total=sum(numbers,n) ;
	printf("%d\n",total);

}
int sum(int *ar,int n)
{
   int i;
   int total=0;
   for(i=0;i<n;i++)
	   total+=ar[i];
   	printf("%d\n",sizeof(ar));
    return total;

}</span>

运行结果是 :   4    24

因为: ar 不是一个数组,它是一个指向 numbers 首元素的指针 ,对于32位的机器,指针存放的是地址,自己本身的大小也是 32位bit ,也就是 4个字节。

——————————————————————————————————————————————————————————————————————————————————————————————————————————————

讲解:  由于 数组名是该数组首元素的地址,所以说实际参数是一个数组名,那么形参必须是与之匹配的指针。而且仅在这种场合C对 int ar[] 跟 int *ar 解释是一样的。

所以说下面几种原型是等价的。

int sum(int *ar , int n);

int sum(int ar[], int n);

int sum(int * , int );

int sum(int [ ] , int );

至于定义也一样。

int sum(int *ar , int n)

{

//代码

}

int sum(int ar[], int n)

{

// 代码

}

————————————————————————————————————————————

如何使用指针参数 (非常重要了!!!!!!!!!!!)

<span style="font-size:14px;">#include<stdio.h>
#define SIZE 5
int sump(int *start ,int *end );
int main()
{
	int num[SIZE]={1,2,3,4,5};
	int total;
    printf("%p %p %p %p %p %p \n",num,num+1,num+2,num+3,num+4,num+5);
	total=sump(num,num+SIZE);
	printf("%d\n",total);
	return 0;

}

int sump(int*start,int *end)
{
    int total=0;
	while(start<end)
	{
	 total+=*start;
	 start++;
	}
	return total;

}</span>

我们发现num+SIZE 指向的是 数组末尾最后一个元素之后 ,0012FF7C 地址对应的是数值5, 而0012FF80 我们不知道对应是那一个值,这叫“”越界“

所以说形参 end 对应实参里面的 num+SIZE 是 0012ff80 地址了,但是这样的好处是简洁啊。。。。。

start++ 在循环之后的值为 end ,但是要跳出循环了,所以仍然是 1+2+3+4+5=15 多好啊。

也可以写成 total+=*start++;  简洁

——————————————————————————————————————————————————

指针运算的优先级:

代码:如下

<pre name="code" class="objc">#include<stdio.h>
int data[2]={100,200};
int moredata[2]={300,400};
int main(void)
{
     int *p1,*p2,*p3;

	 p1=p2=data ;    // 你要记得这里指针也是个变量,只不过存储的是数组首地址而已
	 p3=moredata;
	 printf(" *p1= %d ,*p2= %d ,*p3= %d  \n  ",
		           *p1,     *p2,     *p3    );   //  应该是 100   100  300  吧
	 printf("*p1++=%d ,*++p2=%d, (*p3)++=%d\n ",
		           *p1++ ,   *++p2,      (*p3)++  );  // 应该是  100  200  301
	 printf("*p1=%d   , *P2=%d,  *p3=%d \n  ",
		     *p1      ,    *p2 ,    *p3       );      //  应该是  200 200  300
	 return 0;

}

//  我们来试一下运行结果:
然而自己的并不正确!!!!!!!!!!

所以要多思考一下。

解释:*p1++  由于是同优先级,规定是右结合,所以说 *(P1++),有两步要走,先是 输出*P 值,也就是100 ,副作用是P1指向下一个数组元素的地址

*++P, 相当于 *(++P),考虑到 ++在前面还是后面的问题,所以先指向下一个地址,再取值的。所以为 200

(*P3)++  指针没有变,但是里面的值,加1了,但是这里,是先是 使用(*P3)值后改变(*P3)的值的。所以这里仍然是300 ,

也就是说门牌号码即存放的地址没有变,仍然指向moredata数组的首元素地址,但是里面的值加上1 了,也就是301.

有点费脑子,要多理解。!!!!!!!!!!!!!!!!!

时间: 2024-08-05 11:18:38

数组与指针(三)的相关文章

C++ Primer 第四版读书笔记(三)之数组与指针

C++语言提供了两种类似于vector和迭代器类型的低级复合类型--数组与指针.与vector类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针.设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针. 数组是C++语言中类似于标准库vector类型的内置数据结构.与vector类似,数组也是一种

队列的三种实现(静态数组、动态数组及指针)

本文有关栈的介绍部分参考自网站数据结构. 1. 队列  1.1 队列的定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中没有元素时称为空队列. (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表.    队列的修改是依先进先出的原则进行的.新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头

C语言关于数组与指针内容小结

数组的基本概念 什么是数组:数组就是:数组是相同类型的元素的一个集合       类型说明符 数组名 [常量表达式]: 其中,类型说明符是任一种基本数据类型或构造数据类型.数组名是用户定义的数组标识符.方括号中的常量表达式表示数据元素的个数,也称为数组的长度.例如: int a[10]; /* 说明整型数组a,有10个元素 */ float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */ char ch[20]; /* 说明字符数组ch,有20个元

编程练习之数组与指针

数组与指针 阅读如下代码,为何出错. 1 int main() { 2 char a[] = { "I am a bad boy" }; 3 char * pA = new char[ sizeof( a ) ]; 4 pA = a; 5 6 for ( size_t i = 0; i < sizeof( a ); ++i ) { 7 std::cout << *pA << std::endl; 8 ++pA; 9 } 10 delete [] pA; 1

数组与指针的本质

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明显的,第一个是数组a,第二个是指针p.下一个问题是a的类型是什么?p的类型是什么?a[0]的类型是int,而a是个数组名,它是否表示整个数组呢?事实并非如此,a是一个指针常量,是一个指向int的指针常量,而p是一个指向int的指针,是一个变量.这是它们的第一个区别:一个是常量,一个是变量.那么常量和

C语言之数组与指针(一)

---恢复内容开始--- 数组:内存连续的,同类型元素的集合: 从最基础的数组声明,数组初始化,数组赋值,数组遍历,到二维数组,再到指针数组,数组指针,以及数组和指针关系无疑都证明了数组在c语言中的重要地位:我们将一 一对其说明. 1.数组声明:float a[size] ; int b[size]; char c[size];(size是数组元素个数,必须为正整数 : #define  size 10   ) 这样我们就声明了一个数组:但是在下面代码中我们可以看出了一个问题:没有初始化的数组中

再谈数组与指针

首先看如下一下基础: 一.int *p:p是指向一个整数变量的指针 char *p:p是指向一个字符变量的指针 由int data[30]; int *p;有p=data;或p=&datd[1](i=0,1,2,3....) 上面成立的原因:(1)数组名是该数组首元素的地址 (2)&data表示取整个数组的地址,包括多维数组.&data[0]取数组首个元素的地址.单独data则亦表示数  组首元素的地址. (3)p是p是指向一个整数变量的指针 二. int a[3][4]:a是指向