C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)
生活随笔
收集整理的這篇文章主要介紹了
C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一級指針
- int *p;??????????? //表示定義一個int型(4字節)的指針p
- &p???????????????? //表示p自身的地址位置
- p??? ? ? ? ? ? ? ? //表示p指向的地址位置(也就是p變量的值)
- *p?? ? ? ? ? ? ? ?//表示p指向的地址里面的內容
?
所以 * 的作用: ?p變量的值作為地址,去訪問這個地址的內容
?
二級指針
- int **pp?? ????//表示定義一個int *型的指針pp
- &pp ????? ???? //表示pp自身的地址位置
- pp ???????//表示pp指向的地址, 比如pp=&p,注意pp是int *x型,所以指向其它類型地址將會報錯,
- *pp?????? //表示pp指向的地址上的內容, 比如pp=&p,則*pp將去訪問&p地址的內容.
- **pp???? //表示將pp指向的地址上的內容作為地址,去訪問這個地址的內容, *pp=*(*pp)=*p
例如:
int main() {int i=5; //假設 &i =0x100int *p=&i; //假設 &p =0x500int **pp=&p; //假設 &pp=0x1000/*所以 &i=0x100,i=5&p=0x500 p =0x100 *p=5&pp=0x1000 pp=0x500 *pp=0x100 **pp=5 */ }?二級指針與二維數組使用參考:https://blog.csdn.net/fengxinlinux/article/details/51541003
?
如果想將二維數組作為函數參數使用,可以這樣寫:
#include <stdio.h>void func(int arrs[][2]) {arrs[0][2]=100; }int main() {int arrs[8][2];func(arrs);printf("arrs[0][2]=%d\n",arrs[0][2]);return 0; }?
?
鏈表
首先講講malloc和free:
在添加鏈表和釋放鏈表時需要用到,避免內容被自動釋放
void *malloc(int size);?
malloc返回值是void *類型,所以需要用指針獲取,且還需要強制轉換.
void free(void *ptr);?
釋放地址,和malloc搭配使用,例如:
char *p;char str[]="ABCD"; p= (char *)malloc(strlen(str)); //必須使用指針獲取,并強制轉換 strcpy(p,str);... ...free(p);?
?
雙向鏈表實例如下:?
#include "stdio.h" #include <stdlib.h> #include "string.h"typedef struct NAME{ char *name;struct NAME *preced; //上個name鏈表成員struct NAME *next; //下個name鏈表成員 }T_NAME, *PT_NAME;PT_NAME g_ptNameListHead=NULL; //鏈表頭void add_LinkList(PT_NAME nameNew) {PT_NAME ptTamp;int i=0;if(g_ptNameListHead==NULL) //第一次添加鏈表{g_ptNameListHead= nameNew;return ;}else{ptTamp=g_ptNameListHead;while(ptTamp->next) //下個鏈表成員是否為空{ptTamp=ptTamp->next;}ptTamp->next=nameNew; //添加下個鏈表成員 nameNew-> preced= ptTamp; //在下個鏈表成員里添加上個鏈表 return ; } }void add_name(char str[]) {PT_NAME ptTamp;char *p; p=(char *)malloc(strlen(str));strcpy(p,str);ptTamp=(PT_NAME)malloc(sizeof(T_NAME));ptTamp->name=p;ptTamp-> preced=NULL;ptTamp-> next= NULL;add_LinkList(ptTamp); //添加鏈表 }/*從鏈表里找到name位置*/ PT_NAME find_name(char str[]) {PT_NAME ptTamp;if(g_ptNameListHead==NULL)return NULL;
ptTamp=g_ptNameListHead;while(ptTamp){if(strcmp(ptTamp->name,str)==0) //find{return ptTamp;}elseptTamp=ptTamp->next;}return NULL;}int del_name(char str[]) {PT_NAME ptTamp;PT_NAME ptLast;PT_NAME ptNext;
ptTamp=find_name(str);if(!ptTamp)return -1;if(ptTamp==g_ptNameListHead) //若去掉的是鏈表頭{g_ptNameListHead=ptTamp->next; //指向下個鏈表成員}else{/*獲取上個鏈表成員和下個鏈表成員*/ptLast=ptTamp->preced; ptNext=ptTamp->next ;/*去掉當前鏈表成員*/ptLast->next= ptNext;ptNext->preced=ptLast;}free(ptTamp->name);free(ptTamp);return 0; }void List_name(void) {int i=0;PT_NAME ptTamp=g_ptNameListHead;while(ptTamp){printf("<%d> %s\n",i,ptTamp->name); ptTamp=ptTamp->next;} }void scanf_name(char cmd) {char name[128];switch(cmd){case 'a': //add{printf("please enter name:\n");scanf("%s",name);add_name(name);printf("add %s OK\n",name);break;}case 'd': //del{printf("please enter name:\n");scanf("%s",name);if(del_name(name)<0){printf("del %s error\n",name);}elseprintf("del %s OK\n",name); break;}case 'l': //listList_name(); break;} }int main(int argc, char **argv) {char c;while(1){printf("**********************\n");printf("<l> List all the names\n");printf("<a> add one name\n");printf("<d> del one name\n");printf("<q> quit\n");printf("**********************\n");do{scanf("%c",&c);}while(c!='a'&&c!='d'&&c!='q'&&c!='l'); switch(c){case 'a':case 'l':case 'd':scanf_name(c); break;case 'q':return 0;default : break;}} }
?
總結
以上是生活随笔為你收集整理的C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 学习资源整理
- 下一篇: RSA加密解密简单使用