指针入门
1.什么是指针?
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。简单的说指针表示一个地址(存放的是地址)。
举例说明
#include<stdio.h>
int main(){
int num=1;
/*定义一个指针变量
int* 表示指针类型
名称 A 表示一个 int* 类型
A 指向一个 int 类型的变量地址
*/
int*A=#
/*num的地址
如果要输出一个变量的地址,用 %p
&num 表示取出这个变量的对应地址
*/
printf("num的值=%d num的地址=%p",num,&num);
/*指针变量本身就有地址
A 指针变量的存放地址
*/
printf("\nA 的地址是 %p A 存放的值是一个地址为 %p A 指向的值=%d",&A,A,*A);
return 0;
}
注:1.A 存放值就是 num ,所以地址是一样的。不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。比如变量int型对应指针变量int
2.&A是指针变量本身地址,A是指针指向的地址,A指针指向的值
练习题:写一个程序,获取一个int变量num的地址,并显示到终端将num 的地址赋给指针ptr ,并通过 ptr 去修改 num的值。**
#include <stdio.h>
int main(){
int num = 50;
int* A = #//获取一个int变量num的地址
printf("变量num的地址= %p \n",&num);//变量num的地址
*A = 90;
printf("num的值=%d",num);
return 0;
}
这样可能看不出来,我们可以先把num的初始值打印出来,如下
#include <stdio.h>
int main(){
int num = 50;
int* A = #//获取一个int变量num的地址
printf("变量num的地址= %p \n",&num);//变量num的地址
printf("num = %d",num);//打印num的值
*A = 90;
printf("num的值=%d",num);
return 0;
}
常见错误[Warning] initialization makes pointer from integer without a cast**
//错误示范
#include<stdio.h>
int main(){
int a = 300;
int*prt = a;
printf("*prt的地址=%p",*prt);
}
** 不要把整数直接赋值给指针,把(int prt=a改为int p=&a)。
//正确示范
#include<stdio.h>
int main(){
int a = 300;
int*prt = &a;
printf("*prt的地址=%p",*prt);
}
2.值传递和地址传递
C语言传递参数(或者赋值)可以是值传递(pass by value),也可以传递指针(a pointerpassed by value),传递指针也叫地址传递。
1)默认传递值的类型:基本数据类型(整型类型、小数类型。字符类型),结构体,共用体。
2)默认传递地址的类似:指针、数组。
值传递和地址传递的特点
1)值传递:将变量指向的存储内容,在传递 / 赋值时,拷贝一份给接收变量(单向传递,即主调函数调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变)。
2)地址传递也叫指针传递:如果是指针,就将指针变量存储的地址,传递给接收变量,如果是数组,就将数组的首地址传递给接收变量。**
值传递例子
#include<stdio.h>
void swap(int *x, int *y)
{
int* tmp;
printf("x地址=%p y地址=%p\n", &x, &y);
tmp = x;
x = y;
y = tmp;
//printf("x=%d y=%d\n", *x, *y);
}
int main()
{
int a = 1, b = 2;
int *p1 = &a;
int *p2= &b;
printf("a地址=%p b地址=%p\n", &a, &b);
printf("p1地址=%p p2地址=%p\n", &p1, &p2);
swap(&a, &b);
printf("ab交换后: ");
printf("a=%d b=%d\n", *p1, *p2);
return 0;
}
**传参过程相当于执行int x=p1;int y=p2;形参x,y是实参p1和p2的一份拷贝,它们在内存中也有自己的地址。接着在swap函数中加上打印,看下swap函数到底交换了什么。
地址传递例子
例如将整数a地址的值给int*p 在把指针p的地址给指针p2,然后给p2赋值
#include <stdio.h>
int main(){
int a=10;
int *p=&a;
int *p2 = p;
*p2=50;
printf("a = %d, b = %d, *p=%d\n",a,*p,*p2);
return 0;
}