700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言 变量的指针和指向变量的指针变量

C语言 变量的指针和指向变量的指针变量

时间:2022-05-04 00:59:02

相关推荐

C语言 变量的指针和指向变量的指针变量

一、指针变量的定义变量的指针就是变量的地址。我们可以定义一个指向 变量(普通变量) 的 指针变量。这种指针变量,我们在定义的时候,会引入一个 * ,用于在定义的语句中表示“这是一个指针变量”。一般形式: 类型标识符*标识符 标识符:就是指针变量名字 int i,j; //普通变量 float k; //普通变量 int *mypoint1,*mypoint2; //定义两个指针变量,这两个指针变量 是指向整型变量的。//指针变量定义时,变量名前面有个 *,这个是和普通变量最明显的区别。 float *pm3; //指向实型变量的指针 float *pm4; //指向实型变量的指针 如何让 整形指针变量 指向一个 整型变量 【整型指针变量只能指向整型变量,实型指针变量只能指向实型变量】 可以用赋值语句使一个整型指针变量指向一个整型变量(普通变量) mypoint1= &i; //&地址符 等价于 mypoint1 指向了 i mypoint2 = &j; //等价于 mypoint2 指向了 j 说明: (1)“定义”指针变量的时候,指针变量前面是*”号的,表示这是正在“定义一个指针变量”。 但是,用指针变量的时候,指针变量名前面是没有*号的,所以指针变量名是 mypoint1,mypoint2,而不是 *mypoint1,*mypoint2. (2) 一个指针变量只能指向同一个类型的变量(普通变量)pm3=&k;二、指针变量的引用牢记:指针变量中只存放地址。不要将一个整型变量赋值给一个指针变量; mypoint = 4; //这样是错误的,mypoint1是个指针变量,而4是个整数。 和指针变量相关的运算符有两个: (1)&:取地址运算符。 (2)*:指针运算符(间接访问运算符),定义指针变量的时候,用到 * ,这个叫做指针运算符。 但是,如果 * 不出现在指针变量定义的场合,而且也不是一个乘法运算符,* 依旧是指针运算符,只不过代表的是该指针变量所指向的变量。int a,b; int *p1,*p2;//这里这个 * 表示这两个变量是指针变量。 a=100; b=200; p1=&a;//把变量 a的地址赋给了p1, ****现在p1指向了a p2=&b;//把变量 b的地址赋给了p2, ****现在p2指向了b printf("%d,%d\n",a,b); printf("%d,%d\n",*p1,*p2); //*p1 指向的变量是 a; *p2 指向的变量是 b。 *p1=a=100;*p2=b=200; //* 指针运算符 不用于定义指针变量的场合时,代表的是它所指向的变量特殊写法解析: (a)&*p1:&是取地址运算符,*是指针运算符,这两个运算符优先级相同,但是这两个运算符都是从右到左结合的; 因此先看 *p1 ,*p1代表的是p1所指向的变量,就是a,那么再执行&运算,就是 &*p1 等价于 &a;又因为 &a 它本身不就是 p1,所以 &*p1 等于什么也没有干。p1=&*p1; ==>p1=&a (b)*&a:&是取地址运算符,*是指针运算符,这两个运算符优先级相同,但是这两个运算符都是从右到左结合的; 因此先看 &a ,也就是p1,那么再执行 * 运算,*&a=*p1,*p1代表的是p1指向的变量,所以也就是a,所以*&a ==> a (c)(*p1)++:*p1 是 a,所以(*p1)++ 就是 a++,这里a++就是100+1=101。 (d)*p1++:因为 ++和 * 同级,又是从右到左,所以*p1++ =*(p1++); 但是注意,这里 p1是指向 变量a(p1保存变量a的地址),然而 p1++,就是内存地址+1,因为 p1是整型(占4个字节),所以 p1++就要跳4个字节。 例如:a 的内存地址是:0x0031fb4,p1++ 等价于0x0031fb4+4=0x0031fb8; 总述:地址是个数字,地址自加1是什么意思呢? 如果普通整型变量i,那么i++,i如果是4,那么i++是5,就是i这个变量对应的内存中的内容+1; 同理,指针变量自加 1,也肯定是这个指针变量中的内容要自加 1,但是这种本来是自加1的操作,对于指针来说就不一定是自加 1,自加几,取决于该指针变量所指向的变量类型,如果p1指向的是整型变量,那么 p1++的内容要加 4;因为 int 是4个字节,p1++ 意味着p1指向 i 之后的变量,要完整跳过4个字节,所以p1++后内存内容如下图所示: p1++后的结果: *(p1++)不再指向 a,他就指向 a后边的内存去了,这段内存就不知道是谁的,所以*p1++这个动作非常危险,因为你会改变不属于你的内存。例题: int *pmax,*pmin,*p,a,b; a=5; b=8; pmax=&a; pmin=&b; if(a<b) {p=pmax; //现在p 指向 a (就是p 保存 a 的地址了) pmax=pmin; //现在pmax 指向 b(就是变成 pmax 保存 b 的值,把最大数的地址保存到pmax) pmin=p;//pmin 指向 a (就是变成 pmin保存 a 的值,把最小数的地址保存到 pmin) } printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*pmax,*pmin);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。