首页 > 百科知识 正文

C语言中二级指针与结构体的初步使用(c语言指针初始化的几种方法)

时间:2023-11-19 06:47:26 阅读:728 作者:直到现在

c语言指针初始化的几种方法?指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针,我来为大家科普一下关于c语言指针初始化的几种方法?以下内容希望对你有帮助!

C语言中二级指针与结构体的初步使用(c语言指针初始化的几种方法)-第1张

c语言指针初始化的几种方法

二级指针

指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> int main0501() { int a1[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9,10,11,12} }; int a2[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//常用此类方式 int a3[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; for (int i = 0; i < 3; i ) { for (int j = 0; j < 4; j ) { printf("%d ", a3[i][j]); } printf("\n"); } printf("\n"); //二维数组的数组名代表第0行的首地址(区别于第0行首元素地址,值相同) //步长不同 printf("a:%d,a 1%d\n", a3, a3 1);//a代表一维数组首行首地址 相差16 printf("%d, %d\n", *(a3 0),*(a3 1) 1);//第0行首元素地址 差16 printf("%d, %d\n", a3[0], a3[0] 1); int a[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; //a:代表首行首地址 //a i -> &a[i]:代表第i行首地址 //*(a i) -> a[i]:代表第i行首元素地址 //*(a i) j -> &a[i][j]:第i行第j列元素的地址 //*(*(a i) j) -> a[i][j]:代表第i行第j列元素的值 return 0; } void printA(int* a, int n) { for (int i = 0; i < n; i ) { printf("%d ", a[i]); } printf("\n"); } int main0502() { int a[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; printA((int*)a,sizeof(a)/sizeof(a[0][0])); return 0; } int main0503() { int a[][10] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; //3个 a[4]的一维数组 //定义数组指针变量 //指向一维数组的指针 int(*p)[10]; //p = &a;//整个二维数组首地址 p=a; p = a;//第0行首地址 printf("p:%d ,p 1:%d\n", p, p 1);//相差10*4=40 int n = sizeof(a) / sizeof(a[0]);//行 int nj = sizeof(a[0]) / sizeof(a[0][0]);//列 for (int i = 0; i < n; i ) { for (int j = 0; j < nj; j ) { //printf("%d ", p[i][j]); printf("%d ", *(*(p i) j)); } printf("\n"); } int t[10]; //测一维数组长度:sizeof()首行首元素地址 printf("sizeof(t)=%d ,sizeof(&t)=%d\n", sizeof(t), sizeof(&t)); //int a[2][10] printf("sizeof(a[0])=%d ,sizeof(&a[0])=%d\n", sizeof(a[0]), sizeof(&a[0])); printf("sizeof(*(a 0))=%d ,sizeof(a 0)=%d\n", sizeof(*(a 0)), sizeof(a 0));//两行等价 return 0; } void printArray(int a[3][4]) { for (int i = 0; i < 3; i ) { for (int j = 0; j < 4; j ) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); } void printArray2(int a[][4])//步长为4*4=16 { for (int i = 0; i < 3; i ) { for (int j = 0; j < 4; j ) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); } void printArray3(int** a)//err 指针的步长不同 这个步长为4 { for (int i = 0; i < 3; i ) { for (int j = 0; j < 4; j ) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); } //数组指针类型 typedef int(*P)[4]; void printArray4(P a)//数组指针 { for (int i = 0; i < 3; i ) { for (int j = 0; j < 4; j ) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); } int main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; printArray4(a); return 0; }

练习1:

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define NUM(a) (sizeof(a)/sizeof(*a)) /* 功能:找到数组中中指定字符串的位置 参数: table:字符串数组(指针数组)首地址 size:数组元素个数 key:匹配字符串,如"do" pos:匹配字符串在数组中的位置,如果"do"在keyword[]中的位置为4 返回值: 成功:0 失败:非0 */ int searchKeyTable(const char* table[], const int size, const char* key, int* pos) { int n = -1; if (table==NULL||key==NULL||pos==NULL) { return -1; } for (int i = 0; i < size; i ) { if (strcmp(table[i], key) == 0) { n = i; break; } } if (n==-1) { return -2; } *pos = n 1; return 0; } int main() { char* keywords[] = { "while","case","static","do" }; int pos = 0; int ret = 0; ret = searchKeyTable(keywords, NUM(keywords), "do", &pos); if (ret!=0) { printf("seachKeyTable err:%d\n", ret); system("pause"); return ret; } printf("%s在keyword中的位置是:%d\n", "do", pos); return 0; }

练习2:

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> int sort(char** array1, int num1, char(*array2)[30], int num2, char** myp3, int* num3) { if (array1==NULL||array2==NULL||myp3==NULL||num3==NULL) { return -1; } //创建一个指针数组 char* temp[num1 num2] char** temp = (char**)malloc(sizeof(char*) * (num1 num2)); if (temp==NULL) { return -2; } //给每个指针分配内存(指向堆区) for (int i = 0; i < num1; i ) { temp[i] = (char*)malloc(sizeof(char)*(strlen(array1[i]) 1)); strcpy(temp[i], array1[i]); } for (int i=num1,j=0; i < num1 num2; i ,j ) { //array2[j]不是i temp[i] = (char*)malloc(sizeof(char) * (strlen(array1[j]) 1)); strcpy(temp[i], array2[j]); } char* p = NULL; //排序 for (int i = 0; i < num1 num2-1; i ) { for (int j = i 1; j < num1 num2; j ) { if (strcmp(temp[i],temp[j])>0)//升序 { p = temp[i]; temp[i] = temp[j]; temp[j] = p; } } } //间接赋值 *myp3 = temp; *num3 = num1 num2; return 0; } void free_buf(char*** p3,int n) { if (p3==NULL) { return; } char** temp = *p3; for (int i = 0; i < n; i ) { if (temp[i]!=NULL) { free(temp[i]); temp[i] = NULL; } } if (temp!=NULL) { free(temp); *p3 = NULL; } } int main() { int ret = 0; char* p1[] = { "aa","cccc","bbbbb" }; char buf2[][30] = { "111111","333333","222222" }; char** p3 = NULL; int len1, len2, len3, i = 0; len1 = sizeof(p1) / sizeof(*p1); len2 = sizeof(buf2) / sizeof(buf2[0]); for (int i = 0; i < len1; i ) { printf("%s ,", p1[i]); } for (int i = 0; i < len2; i ) { printf("%s ,", buf2[i]); } printf("\n\n"); /* 功能: 1.把指针数组p1的字符串取出来 2.把二维数组buf2的字符取出来 3.上面的字符串放在p3,p3是在堆区分配的二维内存 4.对p3中字符串进行排序,通过strcmp进行排序 参数: p1:指针数组首地址,char*p1[]={ "aa","cccc","bbbbb" }; len1:p1元素个数 buf2:二维数组首元素地址,char buf2[][30]={"111111","333333","222222"}; len2:buf2字符串的行数 p3:二级指针的地址,需要在函数内分配二维内存,保存p1和buf2的字符串,还需要排序 len3:保存p3中的字符串个数 返回值: */ ret = sort(p1, len1, buf2, len2, &p3, &len3); if (ret!=0) { printf("sort err:%d\n", ret); system("pause"); return ret; } for (int i = 0; i < len3; i ) { printf("%s ,", p3[i]); } //释放p3所指向的内存 //在函数内部把p3的值赋值为NULL free_buf(&p3,len3); return 0; }

结构体的初始化

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* 1.结构体类型定义 2.结构体变量定义 3.结构体变量初始化 4.typedef 修改类型名 5.点运算符 '.' '->'操作结构体成员 6.结构体也是一种数据类型 */ //1.结构体类型定义 //struct 关键字 //struct Teacher 合在一起才是类型 struct Teacher { char name[50]; int age; }; //2.结构体变量定义 // 1.先定义类型,再定义变量(常用) struct Teacher t1;//全局变量 //2.定义类型同时定义变量 struct Teacher2 { char name[50]; int age; }t3={"tom",15}; struct { char name[50]; int age; }t5; //3.结构体变量的初始化 //定义变量时直接初始化,通过{} struct Teacher t7 = { "lili",12 }; //4.typedef 改类型名 typedef struct Teacher3 { char name[50]; int age; }Teacher3; struct Teacher3 t8; Teacher3 t9; int main() { //1.先定义类型,再定义变量(常用) struct Teacher t2;//局部变量 printf("%s ,%d\n", t7.name, t7.age); //5.点运算符 '.' '->'操作结构体成员 /* struct Teacher { char name[50]; int age; }; */ strcpy(t2.name, "xiaoming"); t2.age = 22; printf("%s ,%d\n", t2.name, t2.age); //结构体在初始化之前必须分配空间,不能指向空 struct Teacher* p = NULL; p = &t2; strcpy(p->name, "xiaoming"); p->age = 22; printf("%s ,%d\n", p->name,p->age); return 0; }

结构体之间的赋值

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> //在定义结构体类型时,不能给成员赋值 //结构体只是一个类型,还没有分配空间 //只有根据其类型定义变量时,才分配空间,有空间后才能赋值 typedef struct Teacher { char name[50]; int age; }Teacher; copyTeacher(Teacher to,Teacher from)//值传递不能修改实参的值 { to = from; printf("[copyTeacher]%s ,%d\n", to.name, to.age);//地址传递可以先修改实参的值 } copyTeacher2(Teacher* to, Teacher* from) { *to = *from; printf("[copyTeacher]%s ,%d\n", to->name, to->age); } void fun(int to, int from) { to = from; } int main() { Teacher t1 = { "tom",21 }; //相同类型的两个结构体变量,可以相互赋值 //把t1成员变量内存的值拷贝给t2成员变量的内存 Teacher t2 = t1; printf("%s %d\n", t2.name, t2.age); Teacher t3; memset(&t3, 0, sizeof(t3)); copyTeacher2(&t3,&t1);//将t1拷贝给t3 printf("[t3]%s ,%d\n", t3.name, t3.age); int a = 10; int b = 0; fun(a, b);//将b的值给a printf("a=%d\n", a);//值传递 形参不能修改实参的值 需要地址传递 return 0; }

,

版权声明:该问答观点仅代表作者本人。如有侵犯您版权权利请告知 cpumjj@hotmail.com,我们将尽快删除相关内容。