指针——c语言——day13

在学习指针之前,务必要搞清楚地址和指针的概念

假设程序已定义了3个整型变量i,j,k, 编译时系统分别分配四个字节给变量i, j,k。在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。假如有输出语句:

printf ("%d",i);

它是这样执行的:根据变量名与地址的对应关系(这个对应关系是在编译时确定的),找到变量i的地址,然后从开始的四个字节中取出数据(即变量的值 3), 把它输出。
假如有输入语句:

scanf("%d", &j)

在执行时,把从键盘输入的值送到地址整型存储单元中。如果有语句:

k = i + j;

则从内存中取出i的值 (3), 再取出j的值 (6), 将它们相加后再将其和 (9) 送到k所占用的字节单元中。这种按变量地址存取变量值的方式称为“直接访问”方式。

还可以采用另一种称之为“间接访问”的方式,将变量的地址存放在另一个变量中。按C语言的规定,可以在程序中定义整型变量、实型变量、字符变量等,也可以定义这样一种特殊的变量,它是存放地址的。假设我们定义了一个变量 i_pointer, 用来存放整型变量的地址,它被分配四个字节。可以通过下面语句将i的地址存放i_pointer 中。

i_pointer = &i;

指针变量

语法:
   基类型* 指针变量名;
   
   基类型 --- 数据类型
           //基本数据类型 
		   //数组类型 
		   //基类型 表示 指针变量 指向的目标的 数据类型
   *      --- 表示此时定义的变量是一个指针类型的变量 
        
   指针变量名 --- 标识符命名规则 + 见名知意 		
  
  int * p; //表示定义了一个指针类型的变量p   
    
  int a = 10;
  int *p = &a; //指针变量 p 指向 了 int型变量a	

  p变量的数据类型 int * //指针类型 

在访问变量时,可以进行直接访问和间接访问,直接访问类似于

int a = 10;

而间接访问则是通过地址访问到的,其过程是:

 1.首先拿出p指针变量中的值(地址) 到内存中定位 
 2.从定位处开始,偏移出sizeof(基类型)大小的一块空间 
 3.把这块空间当做一个 基类型的 变量来看  

在一段程序中,如果被调函数想要修改主调函数:

1.想修改谁,就把谁的地址传过去 
2.必须要做*运算(间接访问),实现修改 

指针的运算:

1. & 
2. * 
3. p+1  //指向了下一个一基类型的数据
        //跳过了一个基类型 
4. p++ 
5. p-1
6. ---


关系运算 
   > >= < <= == != 
   p>q

 p-q  
     前提: 同一类型的指针 
     表示之间差了几个基类型 
 p+q  //指针不能做加法运算 

指针 + 数组

一维整型数组

int a[5]; //a首元素的地址 
          //a[0]  -- int型 
		  //&a[0] -- int * 
          

int *p = &a[0];
       = a;	

const变量

表示为只读变量,不能改写

int puts(const char *s); 
const char * s;
const int a; //只读变量 
int a = 10;
const int *p = &a; //表示 基类型 为只读 
p --- 指针变量 --本身的类型 int * 
a --- int型变量 --本身类型 int 

p = &a; 

const int *p = &a; 
int const *p = &a; //就近原则 -- 离谁近,就限定谁的  

int *const p = &a;  //限定p为只读 
const int * const p = &a;  //p不能被修改,指向的目标类型不能被修改 
						  //(是不能通过*p) 
   
int puts(const char *s)
{
}//const char *s --在函数里面 不能通过*s修改到外面的数据 

好处:
1.可以接收 字符数组名   //char *
  也可以接收 字符串常量 //const char *
  提高了参数的适用性 
2.避免了 可能出现的修改的操作 
  可以将 运行时的错误,提前到 编译时发现 
  
const char * p 可以用来保存字符串常量的地址

今天写一道练习题

eg:"编写程序实现单词的倒置
    "how  are  you"  ->  "you  are  how"
	
	uoy era woh
	you are how



#include<stdio.h>
#include<string.h>

void reverse_array(char *begin,char *end)
{
	while(begin < end)
	{
		int temp = *begin;
		*begin = *end;
		*end = temp;
		++begin;
		--end;
	}
}

void reverse_array_word(char *begin,char *end)
{
	char *p = begin;
	while(begin <= end)
	{
		if(*(begin + 1) == ' ' || *(begin + 1) == 0)
		{
			reverse_array(p,begin);
			p = begin+2;
		}
		++begin;
	}
}

int main(void)
{
	char s[] = "how are you";

	reverse_array(s,s + strlen(s)-1);
	puts(s);
	reverse_array_word(s,s + strlen(s) - 1);
	puts(s);

	return 0;
}

输出的结果为:
在这里插入图片描述

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值