目錄
一、動態(tài)內存分配
1.1?使用malloc和free函數進行內存的動態(tài)分配和釋放
1.2?內存泄漏和野指針的概念和解決方法
二、復雜數據結構的指針用法
2.1?結構體指針和成員訪問操作符
2.2?指針數組和指向指針的指針
2.2.1?指針數組
2.2.2 指向指針的指針
2.3 動態(tài)內存分配與結構體指針的結合使用
??嗨!我是Filotimo__??。很高興與大家相識,希望我的博客能對你有所幫助。
??歡迎大家給我點贊??、收藏??,并在留言區(qū)??與我互動,這些都是我前進的動力!
??我的格言:森林草木都有自己認為對的角度??。
一、動態(tài)內存分配
1.1?使用malloc和free函數進行內存的動態(tài)分配和釋放
malloc
?函數用于在運行時動態(tài)分配內存。它接受一個參數,表示需要分配的內存大?。ㄒ宰止?jié)為單位),并返回一個指向分配內存的指針。如果分配成功,則返回的指針指向一塊連續(xù)的、未初始化的內存區(qū)域;如果分配失敗,則返回一個特殊的空指針(NULL)。
free
?函數用于釋放之前通過?malloc
?或者類似函數動態(tài)分配的內存。它接受一個參數,表示需要釋放的內存區(qū)域的起始地址。調用?free
?函數將釋放指定內存區(qū)域,這樣釋放的內存可以被重新分配給其他部分。
示例代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-765255.html
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr;
// 動態(tài)分配內存
ptr = (int*)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("內存分配失敗\n");
exit(1); // 終止程序
}
// 使用分配的內存
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// 打印數組的值
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 釋放內存
free(ptr);
return 0;
}
輸出結果如下:
上面的代碼首先使用?malloc
?函數動態(tài)分配了一個數組,然后使用循環(huán)給數組賦值。最后打印數組的值,并使用?free
?函數釋放了之前分配的內存空間。
1.2?內存泄漏和野指針的概念和解決方法
內存泄漏指的是分配的內存空間在不再使用時沒有被釋放,導致該內存無法被重新分配使用,并且隨著程序運行時間的增長,已分配但未釋放的內存會不斷增加,最終導致程序崩潰。
可以使用?malloc
?和?free
?函數進行內存管理,為避免內存泄漏,釋放內存的方法是在不再需要內存時調用?free
?函數將其釋放。
野指針則是指指向已釋放或未分配內存空間的指針。
野指針的出現通常是由于對已釋放的內存空間進行操作,或者未初始化指針的值導致指針指向未知的內存空間。使用野指針可能導致程序崩潰或者產生不可預測的結果。為避免野指針,應該在使用指針之前對其進行初始化,并在釋放內存之后將指針置為?NULL
。
示例代碼:
#include <stdio.h>
#include <stdlib.h>
int main() {
// 內存泄漏
int* ptr = (int*)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = 10;
}
// 需要釋放內存
free(ptr);
// 野指針
int* ptr2 = NULL;
ptr2 = (int*) malloc( sizeof(int) );
if ( ptr2 != NULL ) {
*ptr2 = 20;
// 在釋放完內存后,應該將指針賦值為 NULL,避免出現野指針問題
free(ptr2);
ptr2 = NULL;
}
return 0;
}
二、復雜數據結構的指針用法
2.1?結構體指針和成員訪問操作符
在 C 語言中,結構體是一種自定義數據類型,可以將不同類型的數據組合在一起,形成一個整體的數據類型。
結構體指針可以指向結構體變量,也可以指向動態(tài)分配的結構體內存空間,使用結構體指針可以方便地對結構體成員進行操作。
成員訪問操作符有兩種,一種是點操作符號?.
,另一種是箭頭操作符號?->
?。點操作符號用于訪問結構體變量的成員,箭頭操作符號則用于訪問結構體指針指向的結構體變量的成員。
示例代碼:
#include <stdio.h>
#include <string.h>
// 定義一個結構體類型
struct Student {
char name[20];
int age;
float score;
};
int main() {
// 定義一個結構體變量
struct Student stu1 = {"Tom", 18, 90.5};
// 定義一個結構體指針,指向結構體變量
struct Student *p = &stu1;
// 使用成員訪問操作符號點操作符訪問結構體變量的成員
printf("%s %d %.2f\n", stu1.name, stu1.age, stu1.score);
// 使用成員訪問操作符號箭頭操作符訪問結構體指針指向的結構體變量的成員
printf("%s %d %.2f\n", p->name, p->age, p->score);
// 修改結構體指針指向的結構體變量的成員
strcpy(p->name, "Jim");
p->age = 19;
p->score = 88.5;
// 使用成員訪問操作符號點操作符訪問結構體變量的成員
printf("%s %d %.2f\n", stu1.name, stu1.age, stu1.score);
// 使用成員訪問操作符號箭頭操作符訪問結構體指針指向的結構體變量的成員
printf("%s %d %.2f\n", p->name, p->age, p->score);
return 0;
}
輸出結果如下:
在上面的代碼中,我們首先定義了一個結構體類型?Student
,然后定義了一個?Student
?類型的結構體變量?stu1
?和一個指向?stu1
?的結構體指針?p
。接著,我們使用點操作符號和箭頭操作符號分別訪問了結構體變量和結構體指針指向的結構體變量的成員,并修改了結構體指針指向的結構體變量的成員。
2.2?指針數組和指向指針的指針
2.2.1?指針數組
指針數組是一個數組,其元素都是指針類型。每個指針指向一個特定類型的對象或單元??梢酝ㄟ^索引來訪問數組中的每個指針,并使用指針進一步操作對應的對象或單元。
示例代碼:
#include <stdio.h>
int main() {
int num1 = 10, num2 = 20, num3 = 30;
int* ptrArr[3]; // 聲明一個指針數組
ptrArr[0] = &num1; // 指針數組的第一個元素指向 num1
ptrArr[1] = &num2; // 指針數組的第二個元素指向 num2
ptrArr[2] = &num3; // 指針數組的第三個元素指向 num3
for (int i = 0; i < 3; i++) {
printf("Element %d: %d\n", i, *(ptrArr[i]));
}
return 0;
}
輸出結果如下:
在上述示例中,我們定義了一個指針數組?ptrArr
,它有 3 個元素,每個元素都是?int
?類型的指針。我們將?num1
、num2
?和?num3
?的地址依次賦給指針數組的元素,然后通過指針數組訪問并打印對應的值。
2.2.2 指向指針的指針
指向指針的指針是一個指針,它存儲了指針的地址。通過指向指針的指針可以間接地訪問并修改指針所指向的變量。
示例代碼:
#include <stdio.h>
int main() {
int num = 10;
int* ptr = #
int** ptrPtr = &ptr; // 聲明一個指向指針的指針
printf("Value of num: %d\n", num);
printf("Value of *ptr: %d\n", *ptr);
printf("Value of **ptrPtr: %d\n", **ptrPtr);
return 0;
}
輸出結果如下:
在上述示例中,我們定義了一個指針?ptr
,它存儲了?num
?的地址。然后,我們定義了一個指向指針的指針?ptrPtr
,它存儲了?ptr
?的地址。通過?**ptrPtr
,我們可以間接地訪問并輸出?num
?的值。
2.3 動態(tài)內存分配與結構體指針的結合使用
可以使用動態(tài)內存分配和結構體指針的結合使用,來動態(tài)創(chuàng)建和操作結構體對象。這種組合可以在運行時動態(tài)地分配內存空間以存儲結構體對象,并使用結構體指針來訪問和操作這些對象。
示例代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
char name[20];
} Student;
int main() {
int numStudents;
printf("Enter the number of students: ");
scanf("%d", &numStudents);
// 動態(tài)分配內存以存儲指定數量的結構體對象
Student* students = (Student*)malloc(numStudents * sizeof(Student));
// 輸入每個學生的信息
for (int i = 0; i < numStudents; i++) {
printf("Enter information for student %d:\n", i + 1);
printf("ID: ");
scanf("%d", &(students[i].id));
printf("Name: ");
scanf("%s", students[i].name);
}
// 輸出每個學生的信息
printf("\nStudent Information:\n");
for (int i = 0; i < numStudents; i++) {
printf("ID: %d, Name: %s\n", students[i].id, students[i].name);
}
// 釋放動態(tài)分配的內存
free(students);
return 0;
}
在上述示例中,我們首先通過?malloc
?函數動態(tài)分配了足夠的內存空間來存儲指定數量的?Student
?結構體對象。然后,我們使用結構體指針?students
?來訪問和操作每個結構體對象的成員。通過輸入每個學生的信息并輸出學生信息,展示了動態(tài)分配內存和結構體指針的結合使用的一個簡單例子。文章來源地址http://www.zghlxwxcb.cn/news/detail-765255.html
到了這里,關于【c語言指針詳解】復雜數據結構的指針用法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!