[关闭]
@yy0518 2016-02-28T15:21:55.000000Z 字数 1838 阅读 545

C-13

C语言学习笔记


作业修改

看了一下你写的关于指针的笔记,发现我简直太蠢了。。。
采用malloc()函数编写一个变长数组,输入
If you were the lion, the fox will deceive you; if you were the lamb, the fox could come to eat you.
输出并统计字数。
修改后的程序如下:
include"stdio.h"
include"stdlib.h"//包含malloc()和free()的函数原型
include"string.h"

int main()
{
int n,i,j;
char* ptr;
printf("Please input the maximum number of chars:\n");
scanf("%d",&n);
ptr=(char*)malloc(n*sizeof(char));
for(i=0;i < n;i++)
{
printf("Please input the chars(length < %d):\n",n);
scanf("%c",ptr+i);
}
printf("The chars you have input are:\n ");
for(i=0;j < n;j++)
{
printf("%内存释放很重要
return 0; c",*(ptr+j));
}
free(ptr);//
}
至于统计字数这部分的功能实在是不想完成第二遍了。


指针作为函数参数的优势

(1)首先,对变量有一个明确的理解。采用int a=5;就相当于定义了一个变量,变量名为a,变量的值为5,但这个值是可以改变的。在对程序编译连接时,由系统给每一个变量名来分配内存地址,而变量名就相当于是一个符号地址。程序运行时从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。

(2)调用函数的参数值的传递形式是单向传递,实参将值传递给形参,但形参的改变值没办法回传给实参。但如果以指针变量作为函数参数,则有可能通过调用函数而改变主函数中变量的值。
如一个试图交换变量值的子函数的两种写法,一种可行,一种却不可行。
swap1(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
swap2(int *p1,int *p2)
(
int p;
p = *p1;
*p1 = *p2;
*p2 = *p;
)
main()
{
int a=1,b=8;
int *p_a,*p_b;
*p_a = &a;
*p_b = &b;
swap1(a,b);
printf("%d %d\n",a,b);
swap2(p_a,p_b);
printf("%d %d",a,b);
}
试验结果:
1 8
8 1
调用了swap1(a,b)之后,a、b的值并没有发生变化,而swap2(p_a,p_b)却使a、b的值并发生了变化。因为以指针变量作为函数参数,在函数执行过程中使指针变量(p_a,p_b)所指向的变量(a,b)的值发生变化,函数调用结束后,这些变量值的变化依然保留下来,于是就可以通过调用函数使变量的值发生变化,即a、b的值互换。
【值得注意的一点,至少我刚刚就犯了这个错误,虽然是看过一遍提醒的。swap2()中,是int p;p = *p1;而不是int *p ;*p = *p1。因为互换的是指针变量所指的整型变量的值,所以作为一个值互换的中间体应该就是int型。而定义了int *p之后, * p就是指的是p所指向的变量,它所指的单元也是不可预见的,因为对*p赋值可能会破坏系统的正常工作状态,造成不可预见的后果】

(3)通过函数调用得到想要改变的值:首先,在主函数中设变量,并用指针变量指向它,然后将指针变量作为实参,将变量的地址传给所调用的函数的形参,通过形参指针变量,改变变量的值,则在主函数中就可以使用改变了值的变量。

(4)调用函数的单向值传递的特点,对于指针变量来说依然是不可违抗的。也就是说调用函数不可以改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
如果是这样的调用函数:
swap3(int *p1,int *p2)
{
int *p;
p = p1;
p1 = p2;
p2 = p1;
}
main()
{
......
swap3(p_a,p_b);
printf(“%d %d”,*p_a,*p_b);
......
}
在调用函数中swap3(p_a,p_b)交换了p_a和p_b的值,但是调用结束之后,形参p1、p2并不会将互换后的地址回传给实参p_a、p_b,所以调用这个函数对于p_a、p_b的值以及a、b的值都没有任何的影响。

作业

1 任意输入一段英文,倒序显示,并统计字数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注