C语言-指针
什么叫指针:
用来存放变量地址的变量,就称为指针变量
指针一个作用:能够根据一个地址值,访问(取值 | 赋值)对应的存储空间
指针的定义:类型标识符 *指针变量名
如:int *p;
float *P;
其中 * 是一个说明符,用来说明这个变量是个指针变量
前面的类型标识符,表示指针变量所指向的变量的类型,而且只能指向这种类型的变量
*p=10;这里的*表示通过访问p指向的地址对应的存储空间
指针初始化:
// 定义int类型的变量a int a = 20; // 定义一个指针变量p int *p; // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a p = &a;
给指针指向的变量赋值/取值:
//给指针指向的变量赋值: char b=10; printf("修改前b的值%d\n",b); char *p2=&b; *p2=11;// 通过指针变量p间接修改变量a的值 printf("修改前b的值%d\n",b); //取出指针所指向变量的值 //*p2的意思是:根据p2值(即变量b的地址)访问对应的存储空间,并取出存储的内容(即取出变量a的值),赋值给value char value=*p2; printf("取出 b的值b=%d\n",value);
注意:
①. Int *p;
double d=10.0;
p=&d;//不建议此种做法
②.
指针变量是用来存放变量地址的,不要给他随意赋值一个常数,
例如 int *p; p=200; 这是错误的
③.
在指针变量没有指向确定地址之前,不要对它所指的内容赋值,下面的写法错误:
int *p;
*p=10;//错误
应该在指针变量指向一个确定的变量后再进行赋值。下面的写法才是正确的:
int a=2,b;
int *p;
p=&b;
*p=a;
④. Int *p=&a;但是不能写成 int *p;*p=&a;这种写法没有任何的意义,可以认为*是和类型符一起使用的。
⑤. *是指针运算符,访问指针指向的空间
用途:
用途1.互换两个实参的值
/** * 交换2个数 */ void swap(char *v1, char *v2) { // 中间变量 char temp; // 取出v1指向的变量的值 temp = *v1; // 取出v2指向的变量的值,然后赋值给v1指向的变量 *v1 = *v2; // 赋值给v2指向的变量 *v2 = temp; } //用途1.互换两个实参的值 char x=8; char y=11; printf("\n\n交换之前数据x=%d,y=%d\n",x,y); swap(&x, &y); printf("交换之后数据x=%d,y=%d\n",x,y);
用途2.实现函数有"多返回值"
要求:写一个函数sumAndMinus,可以同时计算2个整型的和与差,函数执行完毕后,返回和与差(注意了,这里要返回2个值)
// 计算2个整型的和与差 int sumAndMinus(int v1, int v2, int *minus) { // 计算差,并赋值给指针指向的变量 *minus = v1 - v2; // 计算和,并返回和 return v1 + v2; } //用途2.实现函数有"多返回值" int a=3, b=5; int c; int d=sumAndMinus(3,5, &c); printf("%d+%d=%d,%d+%d=%d",a,b,d,a,b,c);
练习代码:
#include <stdio.h> /** * 使用指针改变一个值 * * @param a 指针变量a */ void change(int *a) { *a=10; } /** * 交换2个数 */ void swap(char *v1, char *v2) { // 中间变量 char temp; // 取出v1指向的变量的值 temp = *v1; // 取出v2指向的变量的值,然后赋值给v1指向的变量 *v1 = *v2; // 赋值给v2指向的变量 *v2 = temp; } // 计算2个整型的和与差 int sumAndMinus(int v1, int v2, int *minus) { // 计算差,并赋值给指针指向的变量 *minus = v1 - v2; // 计算和,并返回和 return v1 + v2; } int main(int argc, const char * argv[]) { int i=2; change(&i); printf("改变后的值i=%d\n",i); // 定义int类型的变量a int a = 20; // 定义一个指针变量p int *p; // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a p = &a; //这里,定义一个指针变量p1 //并将变量a的地址赋值给指针变量p1,所以指针变量p1指向变量a int *p1=&a; //给指针指向的变量赋值: char b=10; printf("修改前b的值%d\n",b); char *p2=&b; *p2=11;// 通过指针变量p间接修改变量a的值 printf("修改前b的值%d\n",b); //取出指针所指向变量的值 //*p2的意思是:根据p2值(即变量b的地址)访问对应的存储空间,并取出存储的内容(即取出变量a的值),赋值给value char value=*p2; printf("取出 b的值b=%d\n",value); //用途1.互换两个实参的值 char x=8; char y=11; printf("\n\n交换之前数据x=%d,y=%d\n",x,y); swap(&x, &y); printf("交换之后数据x=%d,y=%d\n",x,y); //用途2.实现函数有"多返回值" a=3; b=5; int c; int d=sumAndMinus(3,5, &c); printf("%d+%d=%d,%d+%d=%d",a,b,d,a,b,c); printf("\n\n"); return 0; }
浙公网安备 33010602011771号