二级指针是一个指向指针的指针当需要通过函数来修改主调函数内的一级指针(对一个一级指针产生副作用)时,可以在被调函数的参数中使用一个二级指针,由这个二级指针来指向主调函数内的一级指针,接下来我们就来聊聊关于c语言指针和地址的概念 二级指针的三种应用场合?以下内容大家不妨参考一二希望能帮到您!
c语言指针和地址的概念 二级指针的三种应用场合
二级指针是一个指向指针的指针。
当需要通过函数来修改主调函数内的一级指针(对一个一级指针产生副作用)时,可以在被调函数的参数中使用一个二级指针,由这个二级指针来指向主调函数内的一级指针。
当需要返回一个动态二维数组时,可以通过一个二级指针来指向一个动态一维指针数组,再由一维指针数组内的每一个指针指向一个一维动态数组,形成一个动态二维数组。
当需要通过函数来修改主调函数内的指针数组(对一个指针数组产生副作用)时,可以在被调函数的参数中使用一个二级指针,由这个二级指针来指向主调函数内的指针数组元素(一级指针,数组名为在一定的上下文中为指向数组首元素的具有常量性质的指针)。
1 单链表操作(当需要修改链表表头时):
#include <stdio.h>
#include <malloc.h>
struct Node{
int data;
struct Node *next;
};
void listInsert(struct Node **head,int data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
if(*head!=NULL)
newNode->next = *head;
*head = newNode;// 头节点为实节点
}
void listPrint(struct Node *head)
{
while(head!=NULL)
{
printf("%d ",head->data);
head = head->next;
}
printf("/n");
}
void listDel(struct Node *head); // 略
int main()
{
struct Node *head = NULL;
for(int i=1;i<11;i )
listInsert(&head,i);
listPrint(head);
getchar();
}
2 返回动态二维数组
#include <stdio.h>
#include <malloc.h>
int ** retArr2D(int r,int c){
int ** arr = (int**)malloc(sizeof(int*)*r);
for(int i=0;i<r;i )
{
arr[i] = (int*)malloc(sizeof(int)*c);
}
return arr;
}
int main()
{
int i,j;
int r=3,c=4;
int **arr = retArr2D(r,c);
for(i=0;i<r;i )
for(j=0;j<c;j )
arr[i][j] = (i 1)*(j 1);
for(i=0;i<r;i )
{
for(j=0;j<c;j )
printf("- ",arr[i][j]);
printf("/n");
}
getchar();
}
3 操作指针数组
#include <stdio.h>
#include <string.h>
void sort(char **states,int n) // char*states[]
{
char *pt;
int i,j,k;
for(i=0;i<n-1;i )
{
k=i;
for(j=i 1;j<n;j )
if(strcmp(states[k],states[j])>0)
k=j;
if(k!=i)
{
pt=states[i];
states[i]=states[k];
states[k]=pt;
}
}
}
void print(char *states[],int n)
{
int i;
for (i=0;i<n;i )
printf("%s/n",states[i]);
}
int main()
{
char *states[]={ "CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
int n=5;
sort(states,n);
print(states,n);
getchar();
}
-End-