c语言指针入门(学习笔记)

1.什么是指针?

指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。简单的说指针表示一个地址(存放的是地址)。
举例说明

#include<stdio.h>

int main(){
	int num=1;
	
	/*定义一个指针变量 
	int* 表示指针类型
	名称 A 表示一个 int* 类型
	A 指向一个 int 类型的变量地址 
	*/
	int*A=&num;
	
	/*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 = &num;//获取一个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 = &num;//获取一个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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值