指针和一维数组
今天主要学习了指针在一位数组和字符串中的应用
一、指向一维度数组元素的指针
// 定义一个int类型的数组
int a[2];
// 定义一个int类型的指针
int *p;
// 让指针指向数组的第0个元素
p = &a[0];
// 修改所指向元素的值
*p = 10;
// 打印第一个元素的值
printf("a[0] =%d", a[0]);
输出结果:a[0] = 10,说明已经通过指针间接修改了数组元素的值。
数组名代表着数组的首地址,即a == &a[0]
二、指针遍历数组元素
// 定义一个int类型的数组
int a[4] = {1, 2, 3, 4};
// 定义一个int类型的指针,并指向数组的第0个元素
int *p = a;
int i;
for (i = 0; i < 4; i++)
{
// 利用指针运算符*取出数组元素的值
int v = *(p+i);
printf("a[%d] = %d \n", i, v);
}
注意:int v = *(a+i)可以,但int v = *(a++)是错误的,因为数组名a是个常量,不可以进行赋值。a值代表数组的首地址,也就是a[0]的地址ffc3。Int类型下a+1则代表a的值加2,即a[1]的地址ffc5,也就是说,a+i代表着元素a[i]的地址。a+1究竟加多少,取决于数组的类型。
三、用数组名做函数实参
用数组名作为函数实参时,是把实参数组的首地址传递给形参数组,两个数组共同占用同一段内存空间,这样形参数组中的元素值发生变化就会使实参数组的元素值也同时变化
void shuzu(int b[])
{
b[0] = 10;
}
int main()
{
int a[2] = {1,2,};
shuzu(a);
printf("a[0]=%d", a[0]);
return 0;
}
在函数shuzu中将数组名a,也就是数组的地址传给数组b,数组a和b占用着同一块内存空间,所以输出为a[0]=10.
指针与字符串
一、指向字符串的指针
int main()
{
char *s = "yangyuzhe";
printf("%s", s);
return 0;
}
输出结果为:yangyuzhe。
特别注意:
指针s指向字符串常量,所以不可再进行修改。指针可以先定义,再指向字符串,数组名不可以,因为数组名是常量不可以赋值。
char a[] = "yang";定义的是一个字符串变量
char *p = "yang";定义的是一个字符串常量
所以如果想存放可变字符串,最好使用一维数组。
指针和函数
一、返回指针的函数
返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
例如:
char * name(char *str)
{
char *p = str;
// 返回字符串
return p;
}
int main()
{
char str[] = "yang";
// 调用函数
char *r = name(str);
printf("%s", r);
return 0;
}
输出结果为:yang。
二、指向函数的指针
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址,因此,可以利用一个指针指向一个函数。
定义的一般形式:
函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
注意:形式参数的变量名可以省略,甚至整个形式参数列表都可以省略
应用实例:
#include <stdio.h>
int min(int a, int b)
{
return a - b;
}
int sum(int a, int b)
{
return a + b;
}
void mixvalue( int (*p)(int,int) , int a, int b)
{
int result = p(a, b);
printf("计算结果为:%d\n", result);
}
int main()
{
mixvalue(sum, 1, 2);
mixvalue(min, 1, 2);
return 0;
}
在这段代码中,无论是加法减法运算还是增加别的运算功能,都集成在mixvalue中,运用指针调用函数。使得代码有强化空间,更灵活。