上周学习了不少C语言指针和数组函数的问题,下面是我自己学习的一些总结。
v 指针
1. 指针到底是什么?
指针其实也是一种特殊的变量,它与其他普通变量的区别是:普通变量里面是数据本身,而指针变量里面是数据的地址。
例如:
#include
int main()
{
int *p; //定义一个指针变量
int a;
p = &a; //取a的地址赋值给p,那么P中的内容就是a的地址
*p = 1; //*p 也就是相当于a,即a = 1
printf("a : %d\n",a);
return 0;
}
其中,&是取地址的运算符,*是表示指针运算符
3. 指针作函数参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。作用是将变量的地址传送到另一个函数中。
Ø 比较经典的例子就是交换两个数:
#include
void swap(int *i,int *j)
{
int tmp;
tmp = *i;
*i = *j;
*j = tmp;
}
int main()
{
int a = 3;
int b = 4;
swap(&a,&b);
printf("a = %d b = %d\n",a,b);
return 0;
}
运行结果:
a = 4 b = 3
u 在这道程序中,如果将swap函数中的实参改为a,b,形参改为i,j,这个程序的最后运行结果就不是a = 4 b = 3,而是a = 3 b = 4。因为按照上述的改法,程序只是简单将a,b的值复制给了i,j。在调用swap函数后,执行函数体时,i,j(也就是a,b)变量的值的却是交换了,但是函数最后一步需要释放空间,保存在i,j变量中的交换值也会释放,那么最后a,b的值根本就没有交换。
4.Int x=3, y=0 , *px = &x;
v (*p1)++, *p1++区别?
(*p1)++是x的内容加1;
*p1++是先求*p1的值(x),然后再p1++,指向下一个元素,不再指向x;(地址加一)
v 程序示例:
#include
void my_copy(char *i,char *j)
{
while(*i++ = *j++); //简练:同时实现取值,赋值,地址加一,三个功能
}
int main()
{
char a[10] = {0};
char b[10] = {0};
printf("Please input the string of b:\n");
scanf("%s",b);
my_copy(a,b);
printf("a : %s\n",a);
return 0;
}
运行结果:
Please input the string of b:
hello
a : hello
分析:从以上两个函数可以看出在my_copy函数中,语句while(*i++ = *j++); 就相当于*i = *j; i++;j++;这三句话。语句所实现的功能就是将数组b中的,每一个元素都赋值给b。
v 指针函数与数组
1. 数组元素和指针
数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
例如:用指针来遍历一个一维数组
#include
int main()
{
int a[5] = {1,2,3,4,5};
int *p;
int i = 0;
p = a;
for(i = 0;i < 5;i++)
{
printf("%d",p[i]); //p[i]也可以改为(p+i)
}
printf("\n");
return 0;
}
1. 用指针引用数组元素
v C语言规定:
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
例:
P的初值为&a[0] :
p+i和a+i都是a[i]的地址。
*(p+i)和*(a+i)都是p+i和a+i所指向的数组元素,即a[i].
例如:
*(p+5), *(a+5)就是a[5].
v 指向数组的指针变量也可以带下标。p[i]和*(p+i)等价。
v 引用一个数组:
下标法:用a[i]来表示;
指针法:用*(a+i),*(p+i)表示。
v 指针和字符串
1. 如何使用一个指针来访问字符串
v 程序示例:
#include
int main()
{
char *str[2] = {"hello world!","C language"};
printf("%s\n",*(str+0)); //打印出hello world!
printf("%s\n",*(str+1)); //打印出C language
printf("%c\n",*(*(str+1)+0)); //打印出 C
return 0;
}
v 字符数组和字符串的区别
1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。
字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
2. 对字符串指针方式char *ps="C Language";
可以写为:
char *ps; ps="C Language";
而对数组方式: static char st[]={"C Language"};
不能写为:
char st[20] ;st={"C Language"};
而只能对字符数组的各元素逐个赋值。
v 函数与指针
v 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。
v 把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。
v 函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
例如:
int (*pf)();
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。
v 程序示例:
#include
typedef void(*FUNC)(char *);
void print(char *s)
{
printf("%s\n",s);
}
int main()
{
FUNC p; //定义一个指针函数
p = print; //指针指向print函数
p("hello"); //将字符串传给print函数
return 0;
}
这是我对于学习指针、数组、函数的一些总结,其中指针和函数的部分下次再发博客。如果上述小结中有错误,希望大家指出。一起学习,一起进步!