#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
总结:指针就是地址,口语中说的指针通常指的是指针变量
指针+-整数
//
//int my_strlen(char* str)
//{
// int count = 0;
// while (*str != '\0')
// {
// count++;
// //str++;//指针+整数
// str = str + 1;
// }
// return count;
//}
//
//int main()
//{
// int len = my_strlen("abcdef");
// printf("%d\n", len);
// return 0;
//}
指针 - 指针(地址 - 地址) : 得到的是指针和指针之间的元素个数
但有前提:1.两个指针指向同一块空间,指针的类型是一致的
// //2.指针 - 指针得到的是指针和指针之间的元素个数
//
//
//int main()
//{
// int arr[10] = { 1, 2, 3, 4 ,5 , 6, 7, 8, 9, 10};
// //int n = &arr[0] - &arr[9];//-9
// int n = &arr[9] - &arr[0];//9
// printf("%d\n", n);
// return 0;
//}
//int my_strlen(char* str)
//{
// char* start = str;
// while (*str != '\0')
// {
// str++;
// }
// return str - start;//指针-指针得到的是元素个数
//}
//
//int main()
//{
// int len = my_strlen("abcdef");
// printf("%d\n", len);
// return 0;
//}
指针和数组
//
指针和数组的区别
指针就是指针,不是数组
数组就是数组,也不是指针
//
指针的大小:4/8个字节,指针是存放地址的,地址的存放需要多大空间,指针变量的大小就是多少
数组的大小:取决数组的元素个数和每个元素的数据类型
//
指针和数组的联系
1.指针可以指向数组元素的
2.指针可以运算,所以借助于指针可以访问数组
//
//
使用指针来访问数组
//int main()
//{
// int arr[10] = { 0 };
// int* p = arr;//&arr[0]
//
// //存放
// int i = 0;
// //for (i = 0; i < 10; i++)
// //{
// // *p = i + 1;
// // p++;
// //}
// for (i = 0; i < 10; i++)
// {
// *(p + i) = i + 1;
// }
//
// //打印
// p = arr;
// for (i = 0; i < 10; i++)
// {
// printf("%d ", *(p + i));
// }
// return 0;
//}
二级指针
//
//int main()
//{
// int a = 0;//a是要在内存中申请4个字节的空间的
// //一级指针
// int* pa = &a;//pa是指针变量,用来存放地址,也得向内存申请,申请4/8
// //二级指针
// int** ppa = &pa;
//
// printf("%d\n", **ppa);
// return 0;
//}
指针数组
//int main()
//{
// int a = 10;
// int b = 20;
// int c = 30;
//
// int* arr[] = { &a, &b, &c };
// int i = 0;
// for (i = 0; i < 3; i++)
// {
// printf("%d\n", *(arr[i]));
// }
//
// char* arr2[5];
// float* arr3[5];
// return 0;
//}
//int main()
//{
// char* arr[5];//[char* char* char* char* char*]
// char** p = arr;//&arr[0] - char** 二级指针
// return 0;
//}
用指针数组来模拟实现一个二维数组
//int main()
//{
// int arr1[] = { 1,2,3,4,5 };
// int arr2[] = { 2,3,4,5,6 };
// int arr3[] = { 3,4,5,6,7 };
// int* ptr[] = { arr1, arr2, arr3 };
//
// //打印数组
// int i = 0;
// for (i = 0; i < 3; i++)
// {
// int j = 0;
// for (j = 0; j < 5; j++)
// {
// printf("%d ", ptr[i][j]);//是通过对地址进行下标引用操作访问的
// }
// printf("\n");
// }
// return 0;
//}
//void test(int arr[], int sz)//形参可以写成数组的形式,编译器会自动的将其转化为指针,因为数组不能进行相应的运算但指针可以
//{
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// arr[i] = i;
// }
//}
int main()
{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int i = 0;
//for (i = 0; i < 10; i++)
//{
// printf("%d ", i[arr]);//这个写也可以打印,i[arr] - arr[i], arr和i都是[]的操作数
// //i[arr] -- *(i+arr)
// //arr[i] -- *(arr+i)
//}
//数组传参
//int* p = arr;
//test(arr, 10);
//数组名是数组首元素的地址,数组首元素的地址也可以是数组名,二者是等价的
//*(arr+i) -- *(p+i) -- arr[i]
//arr[i] --> *(arr+i) --> *(i+arr) -- i[arr]
//用代码来验证
// for (i = 0; i < 10; i++)
// {
// printf("%p = %p\n", &arr[i], p + i);
// }
// return 0;
//}
二维数组与指针的联系
//int main()
//{
// int arr[3][5];
// //arr[i][j]
// //(*(arr+i))[j]
// //*(*(arr+i)+j)// 二维数组的指针表达形式
// return 0;
//}
#define N_VALUES 5
float values[N_VALUES];
float* vp;
//指针+-整数;指针的关系运算
int main()
{
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;//先++,再解引用*
}
return 0;
}
//这里提到C语言的一个标准规定:
// 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,
// 但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
C语言指针初阶的代码笔记
最新推荐文章于 2024-06-13 11:24:43 发布