指针
(1)Int * p; 它规定的参数是p,而不是* p
形参和实参一定不是相同的变量。程序从主函数进,也从主函数出,调用函数时才会给形参分配空间,用完后形参的空间又会被释放。
指针互换函数:
# include <stdio.h>
# include <stdlib.h>
void swap(int * a, int * b)
{
int k;
k = * a;
* a = * b;
* b = k;
}
int main()
{
int a = 3, b = 5;
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
//这个程序中主函数的a,b与swap函数中的a,b是不同的变量。如果没有指针,也不能用return,因为return只能返回一个值,不能返回两个值,那么不管swap函数里面怎么操作,是不会影响主函数中a,b的值的。指针可以指向地址,对地址中的值更改。主函数可以将实参的地址发送给swap函数,一旦得到了地址,就可以用指针对地址中的值进行操作了。互换地址没有意义,用指针互换地址里存放的值才行。
同样,可以用被调函数来修改主调函数的值,对被调函数中的* a赋值即可。
(2)一维数组,以a[5]为例,a(一维数组名)是一个指针常量,是int *类型,存放的是数组的第一个元素的地址,即首地址。
确定一个一维数组需要的参数:a,即数组的首地址,和数组长度。数组没有结束标志,但字符串有,以/0为结束标志,所以确定字符串只需要首地址就可以。
用指针输出一维数组的值:
# include <stdio.h>
# include <stdlib.h>
void shuchu(int * a, int len)
{
int i;
for (i=0; i<n; i++)
{
printf("%d", *(a+i));//也可以写成a[i]
}
printf("\n");
}
int main()
{
int a[5] = {1, 2, 3, 4, 5};
shuchu(a,5);
system("pause");
return 0;
}
用指针输出一维数组的某个值:
# include <stdio.h>
# include <stdlib.h>
void shuchu(int * s, int len)
{
s[3] = 88;//这里的s[3]就等同于*(s+3),也就是说,s[3]相当于a[3],也相当于*(a+3)
}
int main()
{
int a[5] = {1, 2, 3, 4, 5};
printf("%d\n", a[3]);
shuchu(a,5);
printf("%d\n", a[3]);
system("pause");
return 0;
}
//a[3]等价于* (a+3),所以a[3]代表第4个元素。
指针变量的运算:只能相减,而且是在两个指针指向同一区域的情况下,一般是数组的时候。
sizeof(数据类型/变量名)——功能:其返回值是该数据类型/变量名所占的字节数。
一个指针变量,无论指向哪种数据类型的变量,它只占4个字节。
一个变量的地址用该变量的首字节来表示,后面的字节是来存储数据的。
(3)指针优点总结:
表示一些复杂的数据结构。
快速传递数据,减少内存的消耗。
使函数返回一个以上的值。
能直接访问硬件。
能够方便地处理字符串。
是理解面向对象语言引用的基础。