指针和数组、指针运算:
1、数组名是数组的首地址,这是一个常量
2、指向数组的指针
格式int arr [10] = { 0 } ;
int * p = arr;
当操作指针的时候 间接操作了数组 arr[i] = p[i];
3、指针的降级操作 ,取当前地址的值:p[5]、*p
4、对指向数组的指针进行加减操作,可能会导致数组下标越界 。
5、相同的类型的指针相减 结果是两个指针相差的长度
除了sizeof 对数组名取地址这两种情况下,其他任何情况下数组名都是指向首元素的指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test01()
{
//char *arr[4] = { "aaa", "bbb", "ccc", "ddd" };
#if 0
char *p1 = "aaa";
char *p2 = "bbb";
char *p3 = "ccc";
char *p4 = "ddd";
char *arr[] = { p1, p2, p3, p4 };
#endif
//返回的是首元素的地址
char **arr = malloc(sizeof(char *)* 4);
//错误写法
//char **arr = { "aaa", "bbb", "ccc", "ddd" };
}
void printArray1(int *arr,int len){}
void printArray2(int (*arr)[3], int len){}
void printArray3(char *arr, int len){}
void test02()
{
//除了sizeof 对数组名取地址这两种情况下,其他任何情况下数组名都是指向首元素的指针
int arr1[10]; //arr1 是 int*类型
printArray1(arr1,10);
int arr2[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
}; //arr2 是什么类型? int(*)[3];
printArray2(arr2,3);
char *arr3[] = { "aaa", "bbb", "ccc" };
//arr3是什么类型? char **
//printArray3(arr3,3);
char **arr4[3]; //arr4什么类型? char***
}
void test03()
{
typedef int(ARRAY_TYPE)[10];
typedef int(*ARRAY_POINTER_TYPE)[10];
int arr[10];
int arr2[11];
ARRAY_TYPE *p1= &arr;
ARRAY_POINTER_TYPE p2 = &arr;
//p2 = &arr2;
int(*p3)[10] = &arr;
}
struct Person
{
char name[64];
int age;
};
//只要结构体内部不涉及到指针,并且指针指向堆内存,那么使用默认操作是没有问题的。
struct Teacher
{
char *name;
int age;
};
void test04()
{
//结构体赋值
struct Teacher p1, p2;
//p1 = p2;
}
int main(){
system("pause");
return EXIT_SUCCESS;
}
冒泡排序
void bubble(int* p, int len)
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (*(p + j) > *(p + j + 1))
{
int tmp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = tmp;
}
}
}
}
int main()
{
//数组名是数组的首地址
int arr[10] = { 7, 2, 11, 5,12, 23, 9,8 ,14, 10};
int* p = arr;//整型指针指向数组的首地址
int len = sizeof(arr) / sizeof(arr[0]);
bubble(p, len);
for (int i = 0; i < 10; i++)
{
cout << "第" << i << "个数据是===" << arr[i] << endl;
}
system("pause");
return EXIT_SUCCESS;
}
指针实现获取到某个字符串后的字符,实现strchr函数
// 09strchr函数.cpp : 定义控制台应用程序的入口点。
//
#include "iostream"
using namespace std;
char* mychar(char* arr, char ch)
{
int i = 0;
//没有结束
while (arr[i] != '\0')
{
if (arr[i] == ch)//比较字符串
{
return &arr[i];
}
i++;
}
}
char* mychar1(char* arr, char ch)
{
char *p = arr;
//没有到结尾
while (*p != '\0')
{
if (*p == ch)
{
return p;
}
p++;
}
return NULL;
}
int main()
{
char arr1[] = "hello world";
char ch = 'w';
//char*p = strchr(arr1, ch);
//char* p = mychar(arr1, ch);
char* p = mychar1(arr1, ch);
cout << "截取的字符串是=====" << p << endl;
system("pause");
return EXIT_SUCCESS;
}
字符串翻转
// 10字符串反转.cpp : 定义控制台应用程序的入口点。
//
#include "iostream"
using namespace std;
void reverse(char* arr)
{
int len = strlen(arr);//字符串的长度
char* p1 = arr;
char* p2 = &arr[len - 1];
while (p1 < p2)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2--;
}
}
int main()
{
char arr[] = "hello word";
cout << "字符串反转之前====" << arr << endl;
reverse(arr);
cout << "反转字符串====" << arr << endl;
system("pause");
return EXIT_SUCCESS;
}
指针数组
#include "iostream"
using namespace std;
int main()
{
int a = 10;
int b = 20;
int c = 30;
int * arr[] = { &a, &b, &c };
cout << "arr[0]====" << arr[0] << endl;//输出是地址00BC66EE
cout << "arr[1]====" << arr[1] << endl;//输出是地址00BC668E
cout << "arr[2]====" << arr[2] << endl;//输出是地址00BC662E
cout << "*arr[0]====" << *arr[0] << endl;//输出是10
cout << "*arr[1]====" << *arr[1] << endl;//输出是20
cout << "*arr[2]====" << *arr[2] << endl;//输出是30
system("pause");
return EXIT_SUCCESS;
}
指针数组
#include "iostream"
using namespace std;
int main()
{
char* arr[] = {"hello", "world", "good", "morning"};
cout << "arr[0]=====" << arr[0] << endl; //输出hello
cout << "*arr[0]=====" << *arr[0] << endl; //输出h
cout << "*(arr[0]+1)=====" << *(arr[0]+1) << endl; //输出e
system("pause");
return EXIT_SUCCESS;
}
本文深入探讨了指针和数组的关系,包括数组名作为指针的特性、指针的算术运算、指针与数组之间的转换,以及如何通过指针访问和操作数组元素。同时,文章还介绍了使用指针进行字符串处理、排序算法实现、以及结构体和指针的复杂交互。

被折叠的 条评论
为什么被折叠?



