指针知识点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位)个字节
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言指针的基础知识点: 1.指针的定义和初始化 指针是一个变量,其值为另一个变量的地址。定义指针变量时需要指定指针所指向的变量类型,然后使用*运算符来声明指针变量。指针变量的初始化可以为其赋值为另一个变量的地址,也可以将其初始化为NULL。 2.指针的运算 指针可以进行加、减、自增、自减等运算。指针加上一个整数n时,指向的地址会增加n个存储单元的大小,减去一个整数n时,指向的地址会减少n个存储单元的大小。 3.指针的比较 指针可以进行相等、大于、小于等比较运算。当两个指针指向同一个变量时,它们相等;当两个指针指向同一数组中的不同元素时,它们可以进行大小比较。 4.指针的类型转换 指针可以进行类型转换,但需要注意转换后的指针类型必须与指向的变量类型相同,否则可能会导致程序出错。 5.指针和数组 数组名本身就是一个指针,指向数组的第一个元素。可以使用指针来访问数组中的元素,也可以将指针作为函数参数来传递数组。 以下是一个例子,演示了指针的定义、初始化、运算和比较: ```c #include <stdio.h> int main() { int a = 10; int *p = &a; // 定义指向整型变量a的指针p printf("a的值为:%d\n", a); // 输出:a的值为:10 printf("p指向的变量的值为:%d\n", *p); // 输出:p指向的变量的值为:10 printf("p的值为:%p\n", p); // 输出:p的值为:0x7ffeeb5f8a2c printf("p+1的值为:%p\n", p+1); // 输出:p+1的值为:0x7ffeeb5f8a30 printf("p的地址为:%p\n", &p); // 输出:p的地址为:0x7ffeeb5f8a28 printf("p和&a的比较结果为:%d\n", p == &a); // 输出:p和&a的比较结果为:1 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值