回顾一个细节加新知识【含数组与指针】

c++: 

先来说数组与指针:

在计算机眼里,变量的存放位置是随机的,在使用时根据,自己给它分配的地址来找到变量。

我们知道,数组的名字【数组名】(eg:a[n]中的a)实际上在这里就是a[0]的地址【不知道也无所谓,这就是个知识点】,因此和指针名一样,都是内存地址,不同的是数组代表的地址是常量,一旦定义完成,内存空间就被分配,不能改变,而指针是变量,可以改变。

但是,任何由数组下标来实现的操作 都能用指针来完成

因此,这里有这样的一些等价语句:int *p;

p=a;等价于 p=&a[0];        p=&a[1];等价于p=a+1;

使用一个数组求和,有两种方法:

for(int i=0;i<n;i++) {            |           for(p=a;p<=&a[99];p++){

sum=sum+a[i];                  |          sum=sum+*p;

}                                        |           }

        还有,指针是用来存储变量的。虽然数组和指针都能处理同样的变量,但是它们有一个本质的不同,数组a是指针常量,不是变量,所以像a=p、a++、a+=2这样的表达式都是非法的。【不能赋值给常量!】,但是p=a+1就是合法的。

指针每一次加一或减一对应的都是变量数据类型的长度(储存单元所占据的字节),假如已知&a[0]=3000,若p=a【相当于p=&a[0]】;那么p++后,p=3002,即p=&a[1]。

又比如:【存储单元:8位二进制作为一个存储单元,也就是一个字节】

# include <stdio.h>
int main (void)
{    double a[2], *p, *q;
     p = &a[0];
     q = p + 1; 
     printf ("%d\n", q - p); //两个相同类型的指针相减,表示它们之间相隔的存储单元的数目                 
     printf ("%d\n", (int) q - (int) p); //int让p,q变成了字节相减,结果是字节数之差
     return 0; 
}

像指针相加、相乘和相除,或指针加上和减去一个浮点数,都是非法的。 

从例子出发:【冒泡排序】

/*冒泡排序##28*/
#include <stdio.h>
void mp(int a[], int n);
void swap(int *p1, int *p2);

int main() {
	int n;
	scanf("%d", &n);
	int a[n];
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	mp(a, n);
	/*for (int i = 0; i < n; i++) {//换到主函数也可以,指针已经改变它们了
		printf("%2d", a[i]);
	}*/ 
	return 0;
}

void mp(int a[], int n) {//int a[]是指针,相当于int *a
	int  j;
	int i;
	for ( i = 1; i < n; i++) {
		for ( j = 0; j < n - i; j++) {
			if (a[j] > a[j + 1])
				swap(&a[j], &a[j + 1]);
		}
	}
	for (i = 0; i < n; i++) {
		printf("%2d", a[i]);
	}
}

void swap(int *p1, int *p2) {
	int t;
	t = *p1;
	*p1 = *p2;
	*p2 = t;
}

数组名作为函数参数:(一)数组元素作为函数实参时,函数形参为变量 与变量作为函数实参相同,单向值传递。eg:若主函数里面有需要输入数组的自定义函数:sum=sum+fact(a[i]),则自定义函数为fact(int n);;那么a[i]就是数组元素,作为实参,形参就是变量n【这与变量作为函数实参是相同的】。

(二)指针作为函数的参数,数组名做为实参,形参是指针变量(数组)可以写成数组形式(就是说自定义函数书写时fact(int *a)等价于fact(int a[])  ),在主函数里面就有int a[n];fact(a);[这里单个a可以直接表示地址],现在我们捋【类比】一下:从上一节我写的的指针作为自定义函数里面,我们知道有这样一个写法:若它的主函数里面有int a[];fact(a);则自定义函数有fact(int *p);那么这里的a直接表示地址。只不过主函数里面输入数组是fact(int a[]);【跟之前讲的差不多】。

注意:如果数组是字符串,那么指针指向首字符。

数组名做为函数的参数,在函数调用时,将实参 数组首元素的地址传给形参(指针变量),因此,由于指针的特性(间接访问),形参也指向实参数组的首元素。如果改变形参所指向单元的值,就是改变实参数组首元素的值。

形参数组和实参数组共用同一段存储空间,如果形参数组中元素的值发生变化,实参数组中元素的值也同时发生变化。

        最后注意类型的强制转换,我的这道题里面就是,因为在最后一个自定义函数中return 的是一个int类型(当然现在改回来了),所以,在将result传给上一个函数的时候也是int型,做分母,所以当n=1000时,出现了inf的结果。

/*求e的近似值*/
#include <stdio.h>
double factsum(long int n);
double fact(long int n);

int main() {
	long int n;
	double sum = 0;
	scanf("%ld", &n);
	sum = factsum(n);
	printf("%.8f", sum);
	return 0;
}

double factsum(long int n) {
	double result = 0;
	for (int i = 0; i <= n; i++) {
		result += 1.0 / fact(i);
	}
	return result;
}

double fact(long int n) {
	double result = 1;//返回函数值的时候要注意类型,别写int result=1 !!
	for (int i = 1; i <= n; i++) {
		result *= i;//不然这一步会转换成int【接上句】
	}
	return result;
}

谈谈对二级指针的想法:

指针的本质也是变量,所以它自身肯定也是有地址的现在我们又创造出一个指向它自己地址的变量,那么这个变量自然叫做二级指针喽。

文件操作规则:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值