#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<string.h> #include<stdio.h> void func1(char** p2) //p2来接收p1的地址 { *p2 = 400; //修改p2指向地址存放的数据(修改p1) } void func2(char* p2) //p2(一级指针)来接p1(一级指针) { p2 = 500; //修改p2的值,不会影响p1 要修改p1的数据必须通过二级指针 } void main() { char *p1 = NULL; //p1是一级指针,是变量 4B char **p2 = NULL; //p2是二级指针,是变量 4B p1 = 100; //p1存放100 p2 = 200; //p2存放200 p2 = &p1; //p2存放p1的地址 printf("p1:%d ",p1); //100 *p2 = 300; //修改p2指向地址存放的数据(修改p1) printf("p1:%d ", p1); //200 func1(&p1); //p1的地址 printf("p1:%d ", p1); //400 func2(p1); //p1 printf("p1:%d ", p1); //400 system("pause"); return ; }
2.
int getNum(char **myp1, int *len1 , char **myp2 , int *len2) { int ret = 0; char *p1 = NULL; char *p2 = NULL; p1 = (char*)malloc(100); //p1开辟内存空间,100字节 p2 = (char*)malloc(100); //p2开辟内存空间,100字节 strcpy(p1,"aaaaaaaa"); //向p1指向的内存空间拷贝数据 strcpy(p2, "abfasfsafas"); *len1 = strlen(p1); //求长度 *len2 = strlen(p2); *myp1 = p1; //修改实参的数据(间接赋值) *myp2 = p2; return ret; } void main() { char *p1 = NULL; char *p2 = NULL; int len1 = 0; int len2 = 0; int ret=getNum(&p1,&len1,&p2,&len2); if (ret != 0) { printf("getNum() err"); return 0; } printf("p1:%s ",p1); //p1为字符串的开始地址 *p1为一个字节,只能用%c输出 printf("size:%d ", len1); printf("p2:%s ",p2); //p2为字符串的开始地址 printf("size:%d ", len2); if (p1 != NULL) { free(p1); p1 = NULL; } if (p2 != NULL) { free(p2); p2 = NULL; } system("pause"); return 0; }
3.二级指针做函数输入
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<string.h> #include<stdio.h>
//输入数组元素 void printMyArray(char **myArray, int num) //二级指针做输入 接收 指针数组 { int i; for (i = 0; i < num; i++) { //printf("%s",myArray[i]); // myArray[i]代表指针元素 和 *(myArray+i)相同 printf("%s ", *(myArray+i)); // } return; } //排序 void mySort(char** myArray, int num) //二级指针做输入 { char * tmp = NULL; //tmp指针做中间变量 int i, j = 0; for (i = 0; i < num; i++) //选择排序 { for (j = i; j < num; j++) { if (strcmp(myArray[i], myArray[j]) > 0) { tmp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = tmp; } } } return; } void main() { int num; char* myArray[] = {"aaaaaaaaaaaa","cccccc","bbbbbb","ccccccc","ddddddd"}; //定义一个指针数组,存放指针变量 //printf("%d ",sizeof(myArray)); //myArray为数组大小 指针4B*5=20 //printf("%d ", sizeof(myArray[0])); //myArray[0]为第一个指针变量的大小4B num = sizeof(myArray) / sizeof(myArray[0]); //求出指针数组有多少个元素 printf("排序之前 "); printMyArray(myArray,num); mySort(myArray,num); printf("排序之后 ");
printMyArray(myArray, num);
char **p; p = (char**)malloc(sizeof(char*)*num); //开辟(char*大小)*num的内存空间,p指向开头 if (p == NULL) { return NULL; } for (int i = 0; i < num; i++) { p[i] = (char*)malloc(sizeof(char) * 100); 开辟char大小*100字节的内存空间,p[i]分别指向各自的首地址 sprintf(p[i], "the %d string", num - i); }
printf("排序之前 "); printMyArray(myArray,num); mySort(myArray,num); printf("排序之后 ");
}
二级指针内存模型