指针知识点2

一、 经典的指针程序:互换两数

#include<stdio.h>

void exc(int* a, int* b);

int main(void){
	int a = 3 ;
	int b = 5 ;
	
	exc(&a, &b );
	printf("%d, %d \n",a,b);
	
	return 0;
}

 void exc(int* p, int* q){
	int t;
	
	t = *p;
	*p = *q;
	*q = t;
}
  • 问题:能不能这样写
void exc(int* p, int* q){
	int* t;
	
	*t = *p;
	*p = *q;
	*q = t;
}

答:不能
pint**pint
如果要互换*p*q的值,则 t必须定义成int,不能定义成int*,否则语法错误

* 的含义

1.乘法

2.定义指针变量
如:int*p;

3.指针运算符
该运算放在已经定义好的指针变量的前面
如果p是一个已经定义好的指针变量
则*p表示以p的内容为地址的变量

二 、数组和指针

  指针和一维数组:

#include<stdio.h>

int main(void) {
	int a[5];
	int b[5];
	
	printf("% x \n", &a[0]);
	printf("% x", a);	
}

输出结果
    结论:一维数组名是一个指针常量;
        它存放的是一维数组第一个单元的地址。

  数组下标和指针

#include<stdio.h>

int main(void) { 
	char *p = "abcdef";
	
	printf("% d ,%d" , p[1],*(p+1));	
}

输出

  结论:如果p为指针变量,则 p [ i ] = *(p+i)

  确定一个数组需要两个参数

#include<stdio.h>

void f(int * pArr, int len);
int main(){
	int a[5] = {1, 2, 3, 4, 5 };
	int b[6] = {5, 6, 7, 8, 9 };
	int c[10] = {9, 10, 11, };
	
	f(a, 5);
	f(b, 5);
	f(c, 10);
	
	
	return 0 ;
}

void f(int * pArr, int len){
	int i;
	
	for(i = 0; i < len; i++){ //遍历
		printf("%d ", *(pArr+i)) ;
	}
	printf("\n");
}

输出
结论:需要地址和长度

  修改数组元素的值

#include<stdio.h>

void f(int* pArr, int len);
 
int main(){
	int a[3] = {1, 2, 3};

	printf("%d \n", a[2] ); 
	
	f(a,6);//1
	
	printf("%d \n", a[2] ); 

return 0 ;	
}

void f(int* pArr, int len ){
	pArr[2] = 33;//2
}

输出
分析

  结论:
     1、a = pArr = 数组第一个下标的地址
     2、a [ i ] = pArr [ i ] = *( a + i ) = *( pArr + i )他们是同一个变量
     3、数组通过传入首元素的地址数组的长度,可以对整个数组元素进行修改

  网友提示: 数组的定义是a [ 3 ], a可以表示数组里第一个数的地址;
       * pArr直接读取来获取 a 来获得他们的地址;
      他们虽然是同一个变量、有同样的作用但他们不是相等的

三 、 指针变量运算

  指针变量不能相加不能相乘也不能相除
  如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减

四、一个指针变量占几个字节?

  • 一个变量的地址使用该变量首字节的地址来表示
  • 指针变量类型确定了所指变量占几个字节
  • 首字节的地址编号需要字节来保存
  • 地址是32/64位的数据,一个字节只能保存8位数,所以需要4/8个字节来保存
  • 总结:一个指针变量,无论它指向的变量占几个字节该指针变量本身只占4(32位)/8(64位)个字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值