重新学习C语言day14-指针进阶
Posted RealooC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重新学习C语言day14-指针进阶相关的知识,希望对你有一定的参考价值。
指针回顾
1、指针就是个变量,用来存放地址,地址唯一标识一块内存空间
2、指针的大小为固定的4/8个字节(32位平台/64位平台)
3、指针是有类型的,指针的类型决定了指针+-整数的步长,指针解引用时候的权限
4、指针的运算
字符指针
char str1[] = "hello";
char str2[] = "hello";
char *str3 = "hello"; //常量字符串->不能改
char *str4 = "hello";
if (str1 == str2) //数组名代表首元素地址
{
printf("str1 and str2 are same\\n");
}
else
{
printf("str1 and str2 are not same\\n");
}
if (str3 == str4) //相同的常量字符串只存了一份
{
printf("str3 and str4 are same\\n");
}
else
{
printf("str3 and str4 are not same\\n");
}
//str1 and str2 are not same
//str3 and str4 are same
数组指针
指向数组的指针
int arr[10] = {1, 2, 3, 4, 5};
int(*parr)[10] = &arr; //parr是一个数组指针 -> 其中存放的是数组的地址
double *d[5];
double *(*pd)[5]; //指向指针数组的指针
int arr[10] = {0};
int *p1 = arr;
int(*p2)[10] = &arr;
printf("%p\\n", p1); //000000000061FDF0 -> 数组首元素的地址
printf("%p\\n", p1+1); //000000000061FDE4 -- 跳过一个整型
printf("%p\\n", p2); //000000000061FDF0 -> 数组的地址
printf("%p\\n", p2+1); //000000000061FE08 -- 跳过整个数组
return 0;
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int(*parr)[10] = &arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *(*(parr) + i));
//1 2 3 4 5 6 7 8 9 10
}
指针数组
存放指针的数组
int a[] = {1, 2, 3, 4, 5};
int b[] = {2, 3, 4, 5, 6};
int c[] = {3, 4, 5, 6, 7};
int *arr[] = {a, b, c};
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
// printf("%d ", *(arr[i] + j));
printf("%d ",arr[i][j]);
}
printf("\\n");
}
/*
打印
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
*/
int arr[5]; //整型数组
int *parr1[10]; //整型指针的数组
int(*parr2)[10]; //数组指针,该指针指向一个数组,数组10个元素,每个元素的类型是int
int(*parr3[10])[5]; //存储数组指针的数组,该数组能够存放10个数组指针,每个指针能够指向一个数组,数组5个元素,每个元素是int型
数组传参和指针传参
一维数组传参
void test(int arr[]) {} //ok
void test(int *arr) {} //ok
void test2(int *arr[]) {} //ok
void test2(int **arr) {} //ok
int main(){
int arr1[10] = {0};
int *arr2[20] = {0};
test1(arr1);
test2(arr2);
}
二维数组传参
void test3(int arr[3][5]) {} //ok
void test3(int arr[][5]) {} //ok
void test3(int arr[][]) {} //err
void test3(int *arr) {} //err
void test3(int *(arr)[5]) {} //ok
void test3(int **arr) {} //err
int main()
{
int arr[3][5] = {0};
test3(arr);
}
一级指针传参
C语言进阶学习笔记二指针的进阶(重点必看+代码图解+练习)我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段