1. 指针和数组
指针可以指向数组,使用指针可以访问一维数组元素。指针指向数组方法如下:
void main()
{
int a[10];
int *p = a;//将数组地址赋值给指针p,p指向数组a。这种赋值方式等价于
int *p=&a[0]。
}
2. 指针和字符串
用指针遍历字符串里的所有字符:
传统的方式遍历字符串里的字符:
void main(){
char s[7] = "shen";
for (int i=0;s[i]!='\0';i++){
printf("%C\n",s[i]);
}
}
用指针来遍历字符串里的字符
void main(){
char s[7] = "shen";//定义的是字符串变量
char *p = s;
for (; *p != '\0';p++){
printf("%C\n",*p);
}
}
指针遍历的第二种方法
void main(){
char *p ="shen";//定义的是字符串常量,常量里面的字符是不可以改动的;const常量的意思。所以以后存储字符串应该注意,
如果要改动字符串就用数组来存储字符串;如果不改动就用常量存储,这样用指针更方便。
for (; *p != '\0';p++){
printf("%C\n",*p);
}
}
3. 指针、数组作为函数参数
void change(int c[]){
c[0] = 1;
}
int main()
{
int a[3];
change(a);
printf("a[0] = %d\n",a[0]);
return 0;
}
//或者
void change(int c[]){
c[0] = 1;
}
int main()
{
int a[3];
int *p = a;
change(p);
printf("a[0] = %d\n",a[0]);
return 0;
}
以上两个函数运行结果一样,如果一个函数他的参数是数组,我们可以传数组名,也可以指针变量,条件是指针变量类型一样
void change2(int *c)
{
*c = 10;
}
int main()
{
int a[3];
int *p = a;
change2(a);
printf("a[0] = %d\n",a[0]);
return 0;
}
一个函数如果参数是指针类型的时候可以传数组名,也可以传指针变量;这里a可以变成p效果一样;若*c = 10变成*(c=2),则输出的是a[2]的值
另外,还可以这样访问
void change2(int *c)
{
c[2] = 10;//同样修改a[2]的值
}
int main()
{
int a[3];
int *p = a;
change2(p);
printf("a[2] = %d\n",a[2]);
return 0;
}
4. 指针作为函数返回值
指针是c语言中的一种数据类型,返回指针的一般形式为:类型 * 函数名(参数列表)例如:返回字符串的函数
char *test()
{
return "shenxian";
}
int main()
{
printf("%s\n",test());
return 0;
}
5. 指向函数的指针
指针为什么可以指向一个函数?因为函数也是由一段程序组成的,也需要占内存空间,它也有一个起始地址,因此指针可以指向它,函数名就是函数的地址。
int sum(int a,int b)
{
int c = a + b;
printf("%d + %d = %d\n",a,b,c);
return c;
}
int minus(int a,int b)
{
int c = a - b;
printf("%d - %d = %d\n",a,b,c);
return c;
}
int main()
{
//定义的一个指向函数的指针变量p *p一定要加括号
//被p指向的函数:返回值为int类型,接收两个int类型的参数,
int (*p)(int a,int b);
//让指针变量p指向sum函数
p = sum;
//利用指针变量p间接调用sum函数
//(*p)(7,8);
// 还可以这样调用:
p(7,8);
return 0;
}
//指针指向函数的例子如下:
//这里假设count函数用做a,b的运算
int count(int a,int b,int (*p)(int a,int b))
{
return p(a,b);
}
int main()
{
//假如算加法,那么调用sum函数
//int result=count(7,8,sum);
//假如要算减法,就调用minus函数
int result=count(7,8,minus);
return 0;
}
这里可以看到,p指向的函数改变,就可以改变这里的count函数。可以使程序更模块化。
|
|