如何详细解释指针的概念及其在编程中的应用?

2026-04-12 02:511阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1019个文字,预计阅读时间需要5分钟。

如何详细解释指针的概念及其在编程中的应用?

c

一、指针运算+给一个指针变量+1,通常情况下不是给指针本身+1,而是移动一步,步长根据指针的类型来确定。

int main() { char a=1; int b=1; int arr[10]={0}; char *pa=&a; int *pb=&b; int (*parr)[10]=&arr; // ...}

一、指针运算

给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。

如何详细解释指针的概念及其在编程中的应用?

int main() { char a = 1; int b = 1; int arr[10] = { 0 }; char* pa = &a; int* pb = &b; int(*parr)[10] = &arr; printf("%p\n", pa ); printf("%p\n", pa + 1); //相差1 printf("%p\n", pb); printf("%p\n", pb + 1); //相差4 printf("%p\n", parr); printf("%p\n", parr + 1); //相差40 return 0; }

二、字符指针(char*)

char*用于存储char型变量的地址

1.通过字符指针创建常量字符串

以下是三种打印字符串的方式

int main() { //第一种 char arr[] = "hello world"; printf("%s\n", arr); //arr末尾隐藏\0,打印时读取到\0结束 //第二种 char* p1 = arr; printf("%s\n", p1); //第三种 char* p2 = "hello world"; printf("%s\n", p2); return 0; }

其中第一二种为常规方式,重点分析第三种 ‘char* p2 = "hello world" ’,看似是把char型数组直接赋值给p2指针,实则不然,

因为char型指针最多存放4个字节,而hello world\0有12个字节。p2实际上是存储了首元素地址。

用第三种方式创建的字符串为常量字符串,无法被修改,最好用const加以修饰

2.例题(内容相同的常量字符串,在内存中唯一)

int main() { char arr1[] = "abcdef"; char arr2[] = "abcdef"; char* p1 = "abcdef"; char* p2 = "abcdef"; //如果两个常量字符串完全相同,则其不会在内存中反复创建,只会创建一个,并且拥有唯一的地址 if (arr1 == arr2) //首元素地址不相同 printf("相等\n"); else printf("不相等\n"); if (p1 == p2) //首元素地址相同 printf("相等\n"); else printf("不相等\n"); return 0; //结果为不相等 相等 }


三、数组指针和指针数组

见数组和指针的碰撞

四、函数指针

1.函数指针的形式

以返回值为int,参数为(int,int)的add函数举例 (两变量相加的函数)

它的函数指针p写为:int(*p)(int,int)

int add(int a, int b) { int z = a + b; return z; } int main() { int a = 2; int b = 3; int(*p)(int, int) = &add; //(*p)表示p的本质是指针,其余的int (int,int),表示函数的返回值为int型,传参类型为(int,int) //int(*p)(int, int) = add 也可以行,函数名同样可以表示函数地址 printf("%d\n", (*p)(a, b)); printf("%d\n", p(a, b)); //p和(*p)都可以,因为函数名add <=> 函数的地址p return 0; }

2.例题

pfun1 可以存放test的地址,因为它的本质是函数指针,该函数的返回值类型为void,参数为()

pfun2本质是函数,返回值类型为void*,参数为()


五、函数指针数组

1.函数指针数组的形式

创建一个包含加减乘除函数的数组parr,可以写为int (*parr[4]) (int,int)

int add(int a, int b) { int z = a + b; return z; } int sub(int a, int b) { int z = a - b; return z; } int mul(int a, int b) { int z = a * b; return z; } int div(int a, int b) { int z = a / b; return z; } int main() { int(*parr[4])(int, int) = { &add,&sub,&mul,&div }; for(int i=0;i<4;i++) printf("%d\n", (*(parr[i]))(2, 3)); return 0; }

函数指针数组用于存放函数类型相同的函数的地址

六、函数指针数组的指针

如果想要存储五中的parr这个指针函数数组的地址,我们可以创建函数指针数组的指针pparr,

写作:int(*(*pparr)[4]) (int, int)


本文共计1019个文字,预计阅读时间需要5分钟。

如何详细解释指针的概念及其在编程中的应用?

c

一、指针运算+给一个指针变量+1,通常情况下不是给指针本身+1,而是移动一步,步长根据指针的类型来确定。

int main() { char a=1; int b=1; int arr[10]={0}; char *pa=&a; int *pb=&b; int (*parr)[10]=&arr; // ...}

一、指针运算

给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。

如何详细解释指针的概念及其在编程中的应用?

int main() { char a = 1; int b = 1; int arr[10] = { 0 }; char* pa = &a; int* pb = &b; int(*parr)[10] = &arr; printf("%p\n", pa ); printf("%p\n", pa + 1); //相差1 printf("%p\n", pb); printf("%p\n", pb + 1); //相差4 printf("%p\n", parr); printf("%p\n", parr + 1); //相差40 return 0; }

二、字符指针(char*)

char*用于存储char型变量的地址

1.通过字符指针创建常量字符串

以下是三种打印字符串的方式

int main() { //第一种 char arr[] = "hello world"; printf("%s\n", arr); //arr末尾隐藏\0,打印时读取到\0结束 //第二种 char* p1 = arr; printf("%s\n", p1); //第三种 char* p2 = "hello world"; printf("%s\n", p2); return 0; }

其中第一二种为常规方式,重点分析第三种 ‘char* p2 = "hello world" ’,看似是把char型数组直接赋值给p2指针,实则不然,

因为char型指针最多存放4个字节,而hello world\0有12个字节。p2实际上是存储了首元素地址。

用第三种方式创建的字符串为常量字符串,无法被修改,最好用const加以修饰

2.例题(内容相同的常量字符串,在内存中唯一)

int main() { char arr1[] = "abcdef"; char arr2[] = "abcdef"; char* p1 = "abcdef"; char* p2 = "abcdef"; //如果两个常量字符串完全相同,则其不会在内存中反复创建,只会创建一个,并且拥有唯一的地址 if (arr1 == arr2) //首元素地址不相同 printf("相等\n"); else printf("不相等\n"); if (p1 == p2) //首元素地址相同 printf("相等\n"); else printf("不相等\n"); return 0; //结果为不相等 相等 }


三、数组指针和指针数组

见数组和指针的碰撞

四、函数指针

1.函数指针的形式

以返回值为int,参数为(int,int)的add函数举例 (两变量相加的函数)

它的函数指针p写为:int(*p)(int,int)

int add(int a, int b) { int z = a + b; return z; } int main() { int a = 2; int b = 3; int(*p)(int, int) = &add; //(*p)表示p的本质是指针,其余的int (int,int),表示函数的返回值为int型,传参类型为(int,int) //int(*p)(int, int) = add 也可以行,函数名同样可以表示函数地址 printf("%d\n", (*p)(a, b)); printf("%d\n", p(a, b)); //p和(*p)都可以,因为函数名add <=> 函数的地址p return 0; }

2.例题

pfun1 可以存放test的地址,因为它的本质是函数指针,该函数的返回值类型为void,参数为()

pfun2本质是函数,返回值类型为void*,参数为()


五、函数指针数组

1.函数指针数组的形式

创建一个包含加减乘除函数的数组parr,可以写为int (*parr[4]) (int,int)

int add(int a, int b) { int z = a + b; return z; } int sub(int a, int b) { int z = a - b; return z; } int mul(int a, int b) { int z = a * b; return z; } int div(int a, int b) { int z = a / b; return z; } int main() { int(*parr[4])(int, int) = { &add,&sub,&mul,&div }; for(int i=0;i<4;i++) printf("%d\n", (*(parr[i]))(2, 3)); return 0; }

函数指针数组用于存放函数类型相同的函数的地址

六、函数指针数组的指针

如果想要存储五中的parr这个指针函数数组的地址,我们可以创建函数指针数组的指针pparr,

写作:int(*(*pparr)[4]) (int, int)