目录
一 指针简介
地址:指数据在内存单元中的编号,根据该编号便能找到内存单元,从而找到内存单元中存储的数据。
变量的地址使用取地址符 “&”获取。地址也被称为指针,意思就是通过它能访问以它为地址的内存单元。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h> //字符串处理头文件
int main()
{
int a = 120;
int* p = &a; //指针变量p存储了变量a的地址,
//如果是先定义指针变量在赋值时,则不需要指针符号 *,
int* b;
b = &a;
/*
& 是取地址运算符,用于返回一个操作数的地址。
"*"是指针运算符,用于返回指定地址内保存的变量值。
“ &*”表示先进行* 运算,在进行 &运算,相当于取变量的地址, &*一起使用时遵循自右向左的运算规则;
“*&”表示先进行 & 运算,在进行 * 运算,相当于取变量a所在地址的值,实际上就是变量a , *& 一起使用时遵循自右向左的运算规则;
*
*/
int c = *&a; //取变量a的值
int* d = &*p; //取变量p的地址
printf("%d ,%p \n", c, d);
d++;//指针自增,表示增加一个int型所占用的字节,及自增一次增加4个字节
printf("%p \n", d);
d--;//指针自减,表示减少一个int型所占用的字节,及自减一次减少4个字节
printf("%p", d);
return 0;
}
二 数组与指针
一维数组与指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a[] = { 12,23,32 }; //定义一个数组
int* p = a;//把数组的首地址赋值给指针P,(数组名称就是数组在内存中的首地址)。 int* p = a; 等价于 int* p = &a[0];
//使用指针遍历数组
for (int i = 0; i < 3; i++)
{
printf("%d ,", *(p + i)); //这里的 *(p + i)代表先让指针自增,然后在取指针指向的地址值,p + i 则表示每个数组元素对应的地址
}
//使用指针的自增运算符来遍历数组
for (int i = 0; i < 3; i++)
{
printf("%d ,", *p++);
}
return 0;
}
三 二维数组与指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a[2][3] = { 12,23,32,89,77 }; //定义一个二维数组
int* p = a[0];//把P设置为第一行元素的首地址
//使用指针遍历数组
for (int i = 0; i < 5; i++)
{
printf("%d ,", *(p + i)); //这里的 *(p + i)代表先让指针自增,然后在取指针指向的地址值,p + i 则表示每个数组元素对应的地址
}
printf("\n");
//使用指针的自增运算符来遍历数组
for (int i = 0; i < 5; i++)
{
printf("%d ,", *p++);
}
return 0;
}
四 字符串与指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
//首先定义一个字符串数组,然后再把数组名称赋给指针,使用时访问指针名称便能够得到字符串
char a[] = {"hello world"};
char* b = a;
printf("%s", b);
char test[] = { "hello"};
//指针数组: 数组的每一个元素都是指针变量
char* p[] = {b,test,a};
//遍历指针数组
for (int i = 0; i < 3; i++)
{
printf("%s ,",p[i]);
}
return 0;
}
五 指向指针的指针
一个指针可以指向整型变量、实型变量、字符型变量,当指向另一个指针时,便称作指向指针的指针。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i[] = { 10,22,19,2093 };
int* p1 = i;
//将p1的指针赋给双重指针p2
int** p2 = &p1; //定义一个指向指针的指针变量,这种场合适用于多层级指针嵌套的场合,比如数组的数组。
//使用指针遍历元素
for (int i = 0; i < 4; i++)
{
//*(*p2+i) 的含义是:*p2得到数组的首地址(相当于得到指针p1),然后再再p2的前面加 *来得到元素值,最后再让指针自增来遍历整个数组元素
printf("%d ,", *(*p2+i));
}
return 0;
}
六 指针变量作为函数参数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//定义函数,形参为两个指针
void add(int *a, int *b) {
printf("%d", *a + *b);
}
int main()
{
int a = 12;
int b = 32;
add(&a, &b); //传入实参,类型为指针
return 0;
}
七 返回指针值的函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//定义函数,形参为两个指针,返回值为指针类型
int *add(int *a, int *b) {
int sum = *a + *b;
return ∑
}
int main()
{
int a = 12;
int b = 32;
int *sum= add(&a, &b); //传入实参,类型为指针
printf("%d", *sum);//在指针前面再次加上 *代表取出指针指向的值
return 0;
}
八 指针数组作为main函数的参数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(int argc,char *args[])
{
printf("%d ,%c", argc, args);
return 0;
}