数组指针、函数指针与多级指针及基础运算

一、指针与数组

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main1()
{
int arr[] = { 100,2,3,4,5,6,7,8,9,10 };
//数组名是一个常量 不允许赋值
//数组名是数组首元素地址
//arr=100;//错误
int* p;
p = arr;//【arr表示地址 arr+2表示地址+2】 【*arr表示值 *(arr+2)表示arr[2]值】
printf("%p\n",p);
printf("%p\n", arr);
printf("%d\n", *p);
for (int i = 0;i < 10;i++)
{
//printf("%d\n", arr[i]); 相同
//printf("%d\n", p[i]);相同
//printf("%d\n", *(arr + 4));相同
//printf("%d\n", *(p + i));相同
printf("%d\n", *p);
p++;
//printf("%d\n", p++);相同先算p再++
}
printf("%d\n", (arr + 4));//相当于arr[4]对应的值5
两个指针相减 得到接过是两个指针的偏移量(步数)
所有指针类型 相减接过都是int类型
int step = p - arr;
printf("%d\n", step);//结果为10 【内存地址是
int4个字节偏移40(十六进制)】
return EXIT_SUCCESS;
}

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main2()
{
int arr[] = { 100,2,3,4,5,6,7,8,9,10 };
int* p = arr;//p指向数组的指针
//p[i]==*(p+i) p是变量 arr是常量(不可变)
//p是一个指针 4个字节大小
//arr是一个数组 40个字节大小
printf(“指针类型大小:%d\n”, sizeof§);
printf(“数组大小:%d\n”,sizeof(arr) );
return 0;
}

//冒泡排列
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
void BubbleSort(int* arr,int len)
{
for (int i = 0;i < len - 1;i++)
{
for (int j = 0;j < len -1;j++)
{
/if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + i] = temp;
}
/
if (*(arr + j) > *(arr + j + 1))
{
int temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
}
}
}
}
int main3()
{
int arr[] = { 1,5,9,8,6,3,7,2,4,10 };
BubbleSort(arr,10);
for (int i = 0;i < 10;i++)
{
printf("%d\n", arr[i]);
}
return 0;
}

二、指针运算
加法运算
指针运算不是简单的正数相加
如果是一个int*,+1的结果是增加一个int的大小
如果是一个char*,+1的结果是增加一个char大小

//字符串拷贝
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
void my_strcpy1(char* dest, char* ch)//利用数组
{
int i = 0;
while (ch[i] != ‘\0’)
{
dest[i] = ch[i];
i++;
}
dest[i] = 0;
}
void my_strcpy2(char* dest, char* ch)//指针偏移量*(arr[]+j)
{
int i = 0;
while (*(ch + i))//while (*ch!= ‘\0’)
{
*(dest + i) = (ch + i);
i++;
}
(dest + i) = 0;
}
void my_strcpy3(char
dest, char
ch)//纯指针
{
while (*ch != ‘\0’)
{
*dest = ch;
dest++;//指针+1相当于指向数组下一个元素,内存地址变化一个sizeof(char)
ch++;
}
dest = 0;
}
void my_strcpy4(char
dest, char
ch)
{
while (*dest++ = *ch++);//*ch取值 *dest取值 *dest=*ch 赋值判断 算++
}
int main4()
{
char ch[] = “hello world”;
char dest[100];
my_strcpy4(dest, ch);
printf("%s\n", dest);
return EXIT_SUCCESS;
}

//指针的加减运算与指针的类型有关 p–表示int类型4个字节-1=3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main5()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
p = &arr[3];//arr[-1]数组下标越界
printf("%d\n", p[-2]);//==*(p-2)==p[2] 指针操作数组下标不会越界
int step = p - arr;
printf("%p\n", p);
printf("%p\n", arr);
printf("%d\n", step);//结果为3 指针的加减运算与指针的类型有关 p–表示int类型4个字节-1=3 内存地址相差12/sizeof(int)=偏移量
return 0;
}

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main6()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
p = arr[3];
// p = p + arr; 两个指针相加为野指针
// p = p * arr;
//p = p * 4; //指针之间不能加减乘除取余
//p = p / arr;
//p = p % 4;
if (p > arr) //指针间可比较大小
{
printf(“真\n”);
}
return 0;
}

三、指针数组

//指针数组是数组,数组的每一个元素都是指针类型<——>(二级指针)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main7()
{
//定义数组 数组类型 数据名[元素个数]=[值1,值2]
//定义指针数组
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = { &a,&b,&c };
//arr[0] arr[1] arr[2]
printf("%d\n", *arr[0]);
for (int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
{
printf("%d\n", arr[i]);
}
printf(“指针类型大小:%d\n”, sizeof(arr));//结果为3
4=12
printf(“指针元素大小:%d\n”, sizeof(arr[0]));//结果为4
return EXIT_SUCCESS;
}

int main8()
{
//指针数组里面元素存储互动是指针
int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int c[] = { 7,8,9 };
int* arr[] = { a,b,c };
printf("%d\n",arr[0][1]);//打印出2 即指针数组就是特殊二维数组模型
printf("%p\n", arr[0]);
printf("%p\n", a);
printf("%p\n", &a[0]);
//arr是指针数组的首地址
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%p\n", &arr);
for (int i = 0;i < 3;i++)
{
printf("%d\n", *arr[i]);//结果为1,4,7
printf("%d\n", *(arr+i));
}
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 3;j++)
{
//printf("%d “, arr[i][j]);//以二维数组打印出123 456 789
//printf(”%d “, *(arr[i] + j));//arr[i]地址+j偏移量 表下一项
printf(”%d “, ((arr + i) + j));//指针数组对应于二级指针
}
printf(”\n");//换行 put("");
}
}

四、指针与函数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
/void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
/
void swap(int
a, int
b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main11()
{
int a = 10;
int b = 20;
//swap(a, b);
swap(&a, &b);
//printf("%d\n", a);//结果为10 值传递 形参不影响实参的值
//printf("%d\n", b);//结果为20
printf("%d\n", a);//结果为20 地址传递 形参可影响实参的值
printf("%d\n", b);//结果为10

return EXIT_SUCCESS;

}

五、多级指针

//二级指针就是指向一个一级指针变量地址的指针

/*
int a=10;
int *p=&a;//一级指针
*p=100;//*p就是a
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main9()
{
//指针数组里面元素存储都是指针
int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int c[] = { 7,8,9 };
int* arr[] = { a,b,c };
//即指针数组就是特殊二维数组模型
//
//指针数组和二级指针建立关系
//arr[0][0]相当于a[0]
int** p = arr;
printf("%d\n", **p); //结果为1
printf("%d\n", **(p + 1));//二级指针+偏移量相当于跳过了一个一维数组大小 b结果为4
//printf("%d\n", p + 1);//一级指针+偏移量相当于跳过一个元素
printf("%d\n", ((p+1)+1)); //
(p+1)表示b第二行 *(b+1)表示b行第二个5
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 3;j++)
{
//printf("%d “, p[i][j]);同下
printf(”%d “, *(p[i] +j));
//printf(”%d “, ((p+i)+j));
}
puts(”");
}
return EXIT_SUCCESS;
}

pp二级指针变量的值
*pp一级指针的值
**pp变量的值
*ppp= =pp==&p 表示二级指针变量值
**ppp==*pp==&a 表示一级指针的值
***ppp==**pp==*p==a 变量的值

int main10()
{
int a = 10;
int b = 20;
int* p = &a;
int** pp = &p;
//*pp = &b;//等价于p=&b;
//*pp = 100;//野指针
**pp = 100;//若没有则都为10
printf("%d\n", *p);//结果为100
printf("%d\n", a);//结果为100
printf("%d\n", **pp);//结果为100
return 0;
}

原文链接:http://blog.qmgua.com/?id=62

=========================================

http://blog.qmgua.com/ 为 “布尔博客” 唯一官方服务平台,请勿相信其他任何渠道。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸运的涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值