C语言指针详解(补充中)

关于指针方面,一直记不住,特此写一篇文章梳理一下。

只需要也别注意颜色的部分注的部分。

一:指针和指针变量的区别

  1. 内存区的每一个字节都有一个编号,这就是“地址”。
  2. 如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号)
  3. 指针的实质就是内存“地址”。指针就是地址,地址就是指针
  4. 指针是内存单元的编号,指针变量是存放地址的变量。
  5. 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。

:我们这样记忆:指针变量是一个变量,指针就是地址。

二:指针的使用

(1)指针变量的定义和使用

  1. 指针也是一种数据类型,指针变量也是一种变量
  2. 指针变量指向谁,就把谁的地址赋值给指针变量
  3. * 操作符操作的是指针变量指向的内存空间(就是值的意思,*p 就是取到对应地址内存空间的内容)
  4. P是存放地址的变量,地址就是编号。
#include <stdio.h>

int main()
{
    
	int a = 0;
	char b = 100;
	printf("%p, %p\n", &a, &b); //打印a, b的地址

	//int *代表是一种数据类型,int*指针类型,p才是变量名
	//定义了一个指针类型的变量,可以指向一个int类型变量的地址
	int *p;
	p = &a;//将a的地址赋值给变量p,p也是一个变量,值是一个内存地址编号
	printf("%d\n", *p);//p指向了a的地址,*p就是a的值

	char *p1 = &b;
	printf("%c\n", *p1);//p1指向了b的地址,*p1就是b的值

	return 0;
}

:这一节注意到 char *p1 = &b;    p1指向了b的地址,*p1就是b的值

(2)通过指针间接修改变量的值

# 通过修改指针变量对应地址的内容,从而能够修改实际的参数
int a = 0;
int b = 11;
int *p = &a;

*p = 100;
printf("a = %d, *p = %d\n", a, *p); // a = 100, *p = 100

p = &b;
*p = 22;
printf("b = %d, *p = %d\n", b, *p);

(3)数组指针

数组指针是用的比较多的之一了

1. 数组名字就是数组的首元素地址

	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	printf("a = %p\n", a);
	printf("&a[0] = %p\n", &a[0]);

 2. 数组指针的赋值

#include <stdio.h>
int main(void)
 
{ 
   int a[10]={0};
   int *p=a; //a代表数组首元素的首地址,即p=&a[0];
   int i;
   for(i=0;i<10;i++)
   {
       *(p+i)=i;
       printf("a[%d]=%d\r",i,*(p+i));
       
   }
}


a[0]=0
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a[5]=5
a[6]=6
a[7]=7
a[8]=8
a[9]=9

三:关于可变参数的使用

以下是白嫖C语言函数参数列表里的“...”_jizhouli100的博客-CSDN博客_c语言函数参数...

以Linux “man 手册”里的printf函数声明为例,谈谈我对C语言函数的可变参数的一点理解。

printf的函数声明如下:int printf(const char *format, …); 通常情况下,以这种形式声明的函数参数列表至少需要一个普通的函数参数,后面的省略号不表示省略,而是函数原型的一部分。

可变参数的实现方式:C语言头文件“stdarg.h”提供了一个数据类型va_list和三个带参数的宏(va_start,va_arg和va_end)。

其中va_list的声明如下:

typedef char* va_list;

va_start:使得va_list类型的vp指向第一个可选参数

va_arg:返回参数列表的当前参数并使vp指向参数列表的下一个参数

va_end:把vp指针清为NULL。

下面以自己编写的一段C++代码来验证以上实现方式:

// 求参数列表中可变参数的和(可指定个数)
#include <iostream>
#include <cstdarg>

//求n个可变参数的和 
int sum(int n, int j, ...){
	int s = 0;
	va_list vp;
	va_start(vp, j);  //使得vp指向第一个可选参数 
	for(int i = 0; i < n; ++i){
		s += va_arg(vp, int);
	}
	va_end(vp);
	return s;
}

int main() {
	
	int j = sum(4,3,2,3,4,5,6);
	std::cout << "j=" << j << std::endl;
	
	return 0;
}

分析:函数sum的功能是求前n个可变参数的和,所以对于函数调用“sum(4,3,2,3,4,5,6)”返回值应该为前4个可变参数的和,即为2+3+4+5=14。
输出结果: j=14

注:数组赋值

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值