普通编程C语言用得到指针吗,C语言编程入门——指针(上)

指针,是C语言的灵魂,也是C语言与其他高级编程语言不同的地方,它可以灵活的操作内存,同样,也会带来很多问题,需要安全的使用指针。

指针变量是指存放变量地址的变量,刚开始学可能会有点困难,需要多多理解。

指针常见错误1:

# include

int main(void)

{

int * p; //定义int类型变量指针p

int i = 3;

*p = i; //此语句错误,*p未初始化,p存放了未知的地址,指向了未知的变量,如果被i修改,则会导致错误。

printf("%d\n", *p);

return 0;

}

指针常见错误2:

# include

int main(void)

{

long * p;

double * q;

int i = 3;

double j = 5.5;

long m = 5.5;

//p = &j;//错误。

//p = &m;//错误。

//q = &i;//错误。

//p = &i;//错误。

//注意:指针变量中,不同类型之间即使不会丢失精度,也不能够相互赋值。

printf("%d\n", *p);

printf("%lf\n", *q);

return 0;

}

经典指针程序——互换两个数:

/*

2013年1月22日17:31:51

本程序可说明指针使函数返回多个值

此处涉及到值传递、指针传递和引用传递的区别:

值传递是将i、j的值复制给swap函数;

指针传递是swap函数中的a,b指向主函数的i,j。

引用传递是swap函数中的a,b与主函数的i,j是同一个数,可认为a,b是i,j的别名。

具体此处不再赘述,在以后的学习中将会理解。

虽然指针传递与引用传递类似,但不可将指针与引用混为一谈,即不可认为指针就是引用,引用就是指针。

若不使用指针,则输出结果为:

a = 5, b = 3 //即说明在函数内部数值已交换。

i = 3, j = 5 //而在主函数内部数值未交换。

*/

# include

//本函数为值传递,无法完成互换的要求。

void swap_1(int a, int b)

{

int t;

t = a;

a = b;

b = t;

printf("a = %d, b = %d\n", a, b);

return;

}

//本函数为指针传递,但内部书写错误,将指针变量(地址)互换,指向互换,即原指针变量p指向a,q指向b,互换后,p指向b,q指向a。

void swap_2(int * p, int * q)

{

int * t; //同类型才可相互赋值,所以将变量t定义为 int * 类型。

t = p;

p = q;

q = t; //即p、q是指向i,j的指针变量,更改p、q的值不会改变i,j的值,p,q,i,j是四个不同的变量。

return;

}

//本函数为指针传递,可以完成相互要求。

void swap_3(int * p, int * q)

{

int t;

t = *p;

*p = *q;

*q = t; //*p即为a,*q即为b,此处即为主函数中a,b互换。换言之:*p与a为同一变量,*q与b为同一变量。

return;

}

int main(void)

{

int i = 3;

int j = 5;

//swap_1(i, j);

//swap_2(&i, &j);

swap_3(&i, &j); //指针传递,实参传递的应与形参类型一致,即传递地址,&i, &j。

printf("i = %d, j = %d\n", i, j);

return 0;

}

指针热身程序:

# include

int main(void)

{

int * p; //定义整形指针变量,p是指针变量的名字,int * 表示p变量存放的是int类型变量的地址。

//p变量为int * 类型,即存放int变量地址的类型。

int i = 3;

p = &i;

/*

1. p保存了i的地址,因此p指向i,通过p可以找到i。

2. p不是i,i也不是p,p与i是两个不同的变量。更准备地说:修改p的值不影响i的值,修改i的值不影响p的值。

3. 如果一个指针变量指向了某个普通变量,则

*指针变量 就完全等同于 普通变量

例:如果p是个指针变量,并且p存放了普通变量i的地址

则p指向普通变量i

*p 就完全等同于 i, *p == i (*是取地址&的逆运算,可认为是取出指针所指向的普通变量。)

或者说:在所有出现*p的地方都可以替换成i(除定义声明外)

在所有出现i的地方都可以替换成*p

*p 表示以p的内容为地址的变量

所以,*p 就是 i,修改 *p 的值就是修改i的值。

*/

printf("i = %d\n", i);

printf("i = %d\n", *p);

*p = 99; //即修改了i的值。

printf("i = %d\n", i);

printf("i = %d\n", *p);

return 0;

}

你可能感兴趣的:(普通编程C语言用得到指针吗)