C语言学习笔记—指针(一)地址的引入、指针变量、指针类型、数组的指针

在这里插入图片描述

地址的引入

首先我们引入一个场景:

A:你好请问附近哪里有花店?
B:有“菊花台”花店
A:请问菊花台花店在哪里?
B:直走,左拐,右拐,直走;(中山路102号107)
也就是说A去花店有两种方式

  1. 通过店名一路问过去
  2. 通过花店地址直接找到
    上边的这个场景就对应了C语言变量的访问。
    而变量名的访问有两种方式:
  3. 变量名
  4. 变量地址
    例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int  juHuaTai = 10;
    int meiGuiTai = 9;
    //通过变量名访问
    printf("ju = %d\n",juHuaTai);
    printf("mei = %d\n",meiGuiTai);
   //&是取地址运算符,变量名所代表的变量地址
    printf("ju的地址是:%p\n",&juHuaTai);
    printf("mei的地址是:%p\n",&meiGuiTai);
    //通过地址访问
     printf("通过地址来获取ju:%d\n",*(&juHuaTai));//此时 *代表的是一个运算符,功能是取出内存地址中的数据(取内容运算符) 
    printf("通过地址来获取mei:%d\n",*(&meiGuiTai));
	system("pause");
	return 0;
}

指针变量

关于数组我们知道了使用数组来存储多个同类型的数据并进行运算,前提是我们要知道数组的长度,给定以后便不能再改变。那么我们假若不知道需要处理的数据量,利用数组倒也是可以实现,那就是估计一个数组上限,但这样常常会造成空间浪费。
由此我们就有了指针来存储空间的动态分配。
指针:就是我们上文所说的,通过地址访问操作数据,用指针访问内存和操纵地址。
指针变量:那么和为指针变量呢?即转没用来存放变量地址的变量。
我们举一个例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int x ;
x = 1000;
int *p;
p = &x;
//我们就说p是一个指针变量
//我们就可以通过p间接访问x.
	system("pause");
	return 0}

指针变量的定义:
一般形式:
类型名 *指针变量名
定义指针变量要使用指针声明符 *。
另外我们还需要知道:

  1. C语言使用指针对变量的地址进行操作。
  2. 指针是用来存放内存地址的变量。
  3. 如果一个指针变量的值是另一个变量的地址,那么就称该指针变量指向另外一个变量。
  4. 定义多个指针变量时每一个指针变量前面都要加上*号。

指针变量的初始化:
例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int x ;
	
	int *p = &x;
	
	system("pause");
	return 0}

这里我们要知道的是,初始化时指针变量名前边的*值是代表它是一个指针变量。

指针类型

指针变量定义时的数据类型要和它所指向的变量的数据类型要一致。也就是说什么类型的指针存放什么类型的数据的地址。

#include <stdio.h>
#include <stdlib.h>

int main ()
{
	int *p; //只能存放整数的地址
	char *p2; l//只能存放字符数据的地址
	int a = 10;
	char c = "A';
	p= &a; 
	// p=&c判断计算机的大小瑞
	p2 = &c;
	printf ("a=%d\n" ,*p);
	printf ( "c=%c\n" ,*p2);
	
	//指针++
	prihtf ( "a的地址打印:%p\n",p) ;
	printf ( "a的地址++打印: %p\n",++p);
	printf ("c的地址打印:%p\n",p2) ;
	printf ("c的地址++打印: %p\n",++p2) ;
	
	system ( ""pause" ) ;
	return 0;

数组的指针

数组名本身也是一个地址即指针,但是指针是以地址为值的变量,而数组名的值是一个特殊的固定地址,可以看做指针常量。

#include <stdio.h>
#include <stdlib.h>

int main ()
{
	int array[3]= {1,2,3};
	printf("第一个元素的地址%p\n" , &array[0]);
	printf("第二个元素的地址%p\n" , &array[1]);
	printf("第三个元素的地址%p\n" , &array[2]);
	
	system ( ""pause" ) ;
	return 0;

我们知道数组关心的是首地址,两种表示方式:

  1. 数组名 = 地址
  2. 第一个元素的地址
    于是我们可以写作以下形式:
	int *parray;
	parray = &array[0];
	//parray = array;
	
	printf("第一个元素的地址%p\n",parray++);
	printf("第二个元素的地址%p\n",parray++);
	printf("第三个元素的地址%p\n",parray++);

于是我们便可以知道用指针遍历数组的方式

#include <stdio.h>
#include <stdlib.h>

int main ()
{
	int array[3]= {1,2,3};
	int *parray;
	parray = &array[0];
	
	for(i=0;i<3;i++){
	
		printf(" %d ",*parray) ;
		parray++;
	}
	/*由数组名 = 地址又可以如下操作
		for(i=0;i<3;i++){
	
		printf(" %d ",parray[i]) ;
		parray++;
	}
	*/
	
	system ( ""pause" ) ;
	return 0;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值