关于指针方面,一直记不住,特此写一篇文章梳理一下。
只需要也别注意颜色的部分和注的部分。
一:指针和指针变量的区别
- 内存区的每一个字节都有一个编号,这就是“地址”。
- 如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号)
- 指针的实质就是内存“地址”。指针就是地址,地址就是指针。
- 指针是内存单元的编号,指针变量是存放地址的变量。
- 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。
注:我们这样记忆:指针变量是一个变量,指针就是地址。
二:指针的使用
(1)指针变量的定义和使用
- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
- * 操作符操作的是指针变量指向的内存空间(就是值的意思,*p 就是取到对应地址内存空间的内容)
- 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
注:数组赋值