重要的指针

这篇博客详细介绍了C语言中星号的三种不同含义,包括乘法运算、定义指针变量以及指针运算符。同时,通过实例解释了如何通过被调函数修改主调函数中的变量值。此外,文章深入探讨了一维数组与指针的关系,展示了指针在数组操作中的应用,包括下标与指针的关系、指针变量的运算以及指针变量的大小。最后,文章讨论了指针变量在内存中的占用情况,并提供了sizeof运算符的使用示例。
摘要由CSDN通过智能技术生成

目录

1. 星号的三种含义

2. 如何通过被调函数修改主调函数普通变量的值

3. 指针和数组

3.1   一维数组和指针

3.2 一个指针变量到底占几个字节


1. 星号的三种含义

   1. 乘法

   2. 定义指针变量

         int * p;     //定义了一个名字叫p的变量,int *表示p只能存放int变量的地址

   3. 指针运算符

           该运算符放在已经定义好的指针变量前

           如果p是一个已定义好的指针变量

           则*p表示以p的内容为地址的变量

2. 如何通过被调函数修改主调函数普通变量的值

       1. 实参必须为该普通变量的地址

       2. 形参必须为指针变量

       3. 在被调函数中通过

                                *形参名 = ....

           的方式就可以修改主函数相关变量的值

#include<stdio.h>

void g(int* p, int* q)
{
	*p = 1;
	*q = 3;
}

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

3. 指针和数组

3.1   一维数组和指针

         一维数组名

                   一维数组名是个指针常量

                   他存放的是一堆维组第一个元素的地址

#include<stdio.h>

int main(void)
{
	int a[5]; //a是数组名 5是数组元素的个数 元素就是变量 a[0] -- a[4]
	//int a[3][4]; //三行四列 a[0][0]是第一个元素 a[i][j]第i+1行 第j+1列
	int b[5];

	//a = b;//error a是常量
	printf("%#X\n", &a[0]);
	printf("%#X\n", a);


	return 0;
}/*  0X7E99FA98
     0X7E99FA98   输出结果一样 */

       下标和指针的关系

      如果p是个指针变量,则

             p[i] 永远等价于 *(p + i)

     确定一个一维数组需要几个参数

#include<stdio.h>

//f函数可以输出任何一个一维数组的内容
void f(int* pArr, int len)
{  
	int i;

	for (i = 0; i < len; ++i)
		printf("%d  ",  *(pArr + i) );  //*pArr *(pArr+1) *(pArr+2)
	printf("\n");
}

int main(void)
{
	int a[5] = { 1,2,3,4,5 };
	int b[5] = { -1,-2,-3,-4,-5 };
	int c[100] = { 10, 23,4,49 };

	f(a, 5);  // a是 int *
	f(b, 5);
	f(c, 100);

	return 0;
}

         需要两个参数:

                  数组第一个元素的地址

                  数组的长度

include<stdio.h>

void f(int* pArr, int len)
{
	pArr[3] = 88;
}

int main(void)
{
	int a[6] = { 1,2,3,4,5,6 };

	printf("%d\n", a[3]);
	f(a, 6);
	printf("%d\n", a[3]);

	return 0;
}/*
    4
    88   */
#include<stdio.h>

void f(int* pArr, int len)
{
	int i;
	for (i = 0; i < len; ++i)
		printf("%d  ", pArr[i]);//*(pArr+i)等价于pArr[i]
	printf("\n");
}

int main(void)
{
	int a[5] = { 1,2,3,4,5 };
	int b[5] = { 1,3,5,6,7 };
	int c[100] = { 1,33,56,78,19 };

	f(a, 5);
	f(b, 5);
	f(c, 100);
	return 0;
}/*
 1  2  3  4  5
1  3  5  6  7
1  33  56  78  19  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 
 */

指针变量的运算

    指针变量不能相加  不能相乘 也不能相除

    如果两个指针变量指向的是同一块连续空间的不同存储单元

    则这两个指针变量才可以相减

#include<stdio.h>

int main(void)
{
	int i = 5;
	int j = 10;
	int * p = &i;
	int* q = &j;
	int a[5];
	p = &a[1];
	q = &a[4];
	printf("p和q所指向的单元相隔%d个单元\n", q - p);
	//p - q没用实际意义

	return 0;
 
}

3.2 一个指针变量到底占几个字节

 注 :sizeof(数据变量)

         功能:返回值就是该数据类型所占的字节数、

        sizeof(int) = 4     sizeof(char) = 1  sizeof(double) = 8

        sizeof(变量名)

          功能:返回值是该变量所占的字节数

    假设p指向char类型变量(一个字节)

    假设q指向int类型变量(4个字节)

    假设r指向double类型变量(8个字节)

#include<stdio.h>

int main(void)
{
	char ch = 'A';
	int i = 99;
	double x = 66.6;
	char* p = &ch;
	int* q = &i;
	double* r = &x;

	printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r));

	return 0;
}/* 8  8  8
 */

      p q r本身所占的字节数是一样的

总结  一个指针变量,无论它指向的变量占几个字节 ,该指针变量本身只占四个字节

         一个变量的地址使用该变量首字节的地址来表示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值