日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言—指针高级

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言—指针高级 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)容目錄

  • 指針引用二維數(shù)組元素
    • 二維數(shù)組的引用的三種方式:
    • 二維數(shù)組作為函數(shù)參數(shù)
  • 指針數(shù)據(jù)類型
    • 指針數(shù)組
    • 結(jié)構(gòu)體指針
      • 結(jié)構(gòu)體指針變量作為參數(shù)
    • 指針的指針
    • 函數(shù)指針(注意與指針函數(shù)區(qū)別)
    • 指針函數(shù)(注意與函數(shù)指針區(qū)別)
    • 小結(jié)
  • 無(wú)類型指針
  • const限定符
    • const和形式參數(shù)
    • 指向常量數(shù)據(jù)的指針(注意與指針常量區(qū)別)
    • 指針常量

指針引用二維數(shù)組元素

在C語(yǔ)言中,一個(gè)二維數(shù)組可以看成是一個(gè)一維數(shù)組,其中每個(gè)元素又是一個(gè)包含若干元素的一維數(shù)組。

例如: int a[3][5];

a[0]、a[1]和a[2]分別是包含三個(gè)元素的一維數(shù)組名,分別代表a數(shù)組元素的起始地址(即a[0]是第0行元素的首地址, a[1]是第1行元素的首地址)。
a[i]和*(a+i)(無(wú)條件等價(jià))都是第i行第0列元素的地址,那么a[i]+j、*(a+i)+j、&a[0][0]+5*i+j都是第i行第j列元素的地址。

二維數(shù)組的引用的三種方式:

例如:

int a[3][5],(*p)[5]; p = a;

①下標(biāo)法。如a[i][j]或p[i][j]
②指針針?lè)?#xff0c;如*(*(p+i)+j)或*(*(a+i)+j)

示例:

#include <stdio.h> #include <stdlib.h> void main() {int aiNum[3][3]={{1,2,3},{4,5,6},{7,8,9}};int(*p)[3];int i,j;p = aiNum;printf("*(*(p +i)+j) = \n");for (i =0;i < 3;i++){for(j=0;j<3;j++)printf("%d\t",*(*(p +i)+j));}putchar('\n');printf("*(p[i]+j) = \n");for (i =0;i < 3;i++){for(j=0;j<3;j++)printf("%d\t",*(p[i]+j));}putchar('\n');printf("*(&p[0][0]+i*3+j) = \n");for (i =0;i < 3;i++){for(j=0;j<3;j++)printf("%d\t",*(&p[0][0]+i*3+j));}putchar('\n');printf("(*(p+i))[j] = \n");for (i =0;i < 3;i++){for(j=0;j<3;j++)printf("%d\t",(*(p+i))[j]);}putchar('\n'); }結(jié)果: *(*(p +i)+j) = 1 2 3 4 5 6 7 8 9 *(p[i]+j) = 1 2 3 4 5 6 7 8 9 *(&p[0][0]+i*3+j) = 1 2 3 4 5 6 7 8 9 (*(p+i))[j] = 1 2 3 4 5 6 7 8 9

二維數(shù)組作為函數(shù)參數(shù)

①當(dāng)二維數(shù)組名作為函數(shù)實(shí)參時(shí),對(duì)應(yīng)的形參必須是一個(gè)行指針變量

書(shū)寫(xiě)格式:

int main() {int iNum[3][4];……fun(iNum);…… } fun(int (*iNum)[n]) {…… }

②和一維數(shù)組一樣,數(shù)組名傳送給變量的是一個(gè)地址值,因此,對(duì)應(yīng)的形參也必須是一個(gè)類型相同的指針變量,在函數(shù)中引用的將是主函數(shù)中的數(shù)組元素,系統(tǒng)只為形參開(kāi)辟一個(gè)存放地址的存儲(chǔ)單元,而不可能在調(diào)用函數(shù)時(shí)為形參開(kāi)辟一系列存放數(shù)組的存儲(chǔ)單元。

指針數(shù)據(jù)類型

指針數(shù)組

①指針數(shù)組就是其元素為指針的數(shù)組

②每一個(gè)元素都是指針變量

說(shuō)明指針數(shù)組的語(yǔ)法格式為:數(shù)據(jù)類型 *指針數(shù)組名[常量表達(dá)式];

例如: int *p1[6];

③指針數(shù)組主要用于字符串的操作

例如:char *name[3]={“Rose”, “Smith”, “John”};

注意:與一個(gè)指向二維數(shù)組的指針變量的區(qū)別,int (*p1)[6]和int *p1[6]之間的區(qū)別

指針數(shù)組示例:

#include <stdio.h> int main() {int i;char *a[5] ={"aaa","bbbb","ccc","dd","ee"};printf("a = ");for (i = 0;i < 5;i++){puts(a[i]);} }

結(jié)構(gòu)體指針

①結(jié)構(gòu)體指針是通過(guò)在結(jié)構(gòu)體變量名前放置一個(gè)星號(hào)(*)來(lái)進(jìn)行聲明的

②-> 運(yùn)算符用于通過(guò)指針來(lái)訪問(wèn)結(jié)構(gòu)體的元素

示例:

#include <stdio.h>struct stStudent {char acName[10];int iAge; }; int main() {struct stStudent stStu = {"小明",18};struct stStudent *pstStu;pstStu = &stStu;printf("輸出結(jié)果:%s", pstStu ->acName); } 結(jié)果: 輸出結(jié)果:小明

結(jié)構(gòu)體指針變量作為參數(shù)

示例:(注意結(jié)構(gòu)體作為參數(shù)的書(shū)寫(xiě)方式以及調(diào)用結(jié)構(gòu)體的值的方式)

#include <stdio.h> #include <string.h> struct cat {char bk_name[25],author[20];int edn;float price; }; void UpdateBook(struct cat *book) {book->edn=12;(*book).price=(float)12.4;strcpy(book->bk_name,"C Program");strcpy((*book).author,"Tom"); } void PrintBook(struct cat book) {printf("name:%s\nprice:%f\nauther:%s\nedn:%d\n",book.bk_name,book.price,book.author,book.edn); } void main() {struct cat book={"abc","John",14,10.5};PrintBook(book);UpdateBook(&book);PrintBook(book); }結(jié)果: name:abc price:10.500000 auther:John edn:14 name:C Program price:12.400000 auther:Tom edn:12

指針的指針

一種變量專門用來(lái)存放指針變量的地址,這種變量我們稱之這指針的指針變量
語(yǔ)法定義:type **name;

示例:

#include <stdio.h> #include <string.h>void main() { int i=6,*p,**dp;p=&i;dp=&p; //p保存i的地址,*dp保存i的地址,dp保存p的地址printf("i = %d, *p = %d, **dp = %d\n",i,*p,**dp);printf("&i = %x, p = %x, *dp = %x\n",&i,p,*dp); printf("&p = %x, dp = %x\n",&p,dp); }結(jié)果: i = 6, *p = 6, **dp = 6 &i = 19ff2c, p = 19ff2c, *dp = 19ff2c &p = 19ff28, dp = 19ff28

函數(shù)指針(注意與指針函數(shù)區(qū)別)

函數(shù)指針其本質(zhì)是一個(gè)指針變量,該指針變量指向一個(gè)函數(shù)。C程序在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂贰?/p>

聲明一個(gè)函數(shù)指針(示例):

/*聲明一個(gè)函數(shù)指針 */ int (*fptr) (int, int); /* 函數(shù)指針指向函數(shù)func */ fptr = func; // 或者fptr = &func;

func是一個(gè)函數(shù)名,那么func與&func都表示的是函數(shù)的入口地址。

在函數(shù)的調(diào)用中可以使用:方式一:func(),也可以使用方式二:(*fun)()。這兩種調(diào)用方式是等價(jià)的,只是我們平時(shí)大多都習(xí)慣用方式一的調(diào)用方法。

提問(wèn):至為什么func與&func的含義相同?
答:對(duì)于函數(shù)func來(lái)說(shuō),函數(shù)的名稱就是函數(shù)代碼區(qū)的常量,對(duì)它取地址(&func)可以得到函數(shù)代碼區(qū)的地址,同時(shí),func本身也可以視為函數(shù)代碼區(qū)的地址。因此,函數(shù)名稱和對(duì)其取地址其含義是相同的。

示例1 :

#include<stdio.h> int fun(int a, int b, int (*call)(int, int)) {return (call(a, b)); } int max(int v1, int v2) {return (v1 > v2 ? v1 : v2); //如果v1>v2 成立輸出v1 不成立輸出v2 } int main() {printf("max=%d\n", fun(1, 2, max));return 0; }結(jié)果: max=2

示例 2 :

#include <stdio.h> int add(int a, int b); int main(void) {int (*fptr)(int, int); //定義一個(gè)函數(shù)指針int res;fptr = add; //函數(shù)指針fptr指向函數(shù)add/* 通過(guò)函數(shù)指針調(diào)用函數(shù) */res = (*fptr)(1,2); //等價(jià)于res = fptr(1,2);printf("a + b = %d\n", res);return 0; } int add(int a, int b) {return a + b; }結(jié)果: a + b = 3

指針函數(shù)(注意與函數(shù)指針區(qū)別)

指針函數(shù):顧名思義,它的本質(zhì)是一個(gè)函數(shù),不過(guò)它的返回值是一個(gè)指針。

聲明示例:int *pfun(int, int);
由于“*”的優(yōu)先級(jí)低于“()”的優(yōu)先級(jí),因而pfun首先和后面的“()”結(jié)合,也就意味著,pfun是一個(gè)函數(shù)。接著再和前面的“*”結(jié)合,說(shuō)明這個(gè)函數(shù)的返回值是一個(gè)指針。由于前面還有一個(gè)int,也就是說(shuō),pfun是一個(gè)返回值為整型指針的函數(shù)。

示例:

#include <stdio.h> //這是一個(gè)指針函數(shù)的聲明 int *pfun(int *arr, int n); //主函數(shù)中,把一個(gè)數(shù)組的首地址與數(shù)組長(zhǎng)度作為實(shí)參傳入指針函數(shù)pfun里,把指針函數(shù)的返回值(即指向數(shù)組的指針)賦給整形指針p。最后使用指針p來(lái)遍歷數(shù)組元素并打印輸出。 int main(void) {int array[] = {0, 1, 2, 3, 4};int len = sizeof(array)/sizeof(array[0]); //數(shù)組的元素個(gè)數(shù)int *p;int i;//指針函數(shù)的調(diào)用p = pfun(array, len);for(i = 0; i < len; i++){printf("array[%d] = %d\n", i, *(p+i));}return 0; }//這是一個(gè)指針函數(shù),其返回值為指向整形的指針 int *pfun(int *arr, int n) {int *p = arr;return p; }結(jié)果: array[0] = 0 array[1] = 1 array[2] = 2 array[3] = 3 array[4] = 4

小結(jié)

無(wú)類型指針

①無(wú)類型指針可以指向任何類型的數(shù)據(jù)

②無(wú)類型指針定義:void *p;

③可以將任意類型的指針(包括函數(shù)指針)直接賦給無(wú)類型指針,但不能將無(wú)類型指針直接賦給其它類型指針,例如:

int *q,*m; void *p; p = q; //只獲得變量/對(duì)象地址而不獲得大 m = (int *)p;

④不能將無(wú)類型指針參與算術(shù)運(yùn)算,例如:

void *p; p++;//錯(cuò)誤,進(jìn)行算法操作的指針必須是確定知道其指向的數(shù)據(jù)類型大小 ((int *)p) ++; //正確,能通過(guò)

⑤無(wú)類型指針主要作用:

  • 對(duì)函數(shù)返回的限定(malloc函數(shù))
  • 對(duì)函數(shù)參數(shù)的限定 (memcpy函數(shù))

代碼示例:

#include<iostream> #include<string> using namespace std;typedef struct tag_st {string id;float fa[2]; }ST;int main() {ST* P = new ST;P->id = "hello!";P->fa[0] = 1.1;P->fa[1] = 2.1;ST* Q = new ST;Q->id = "world!";Q->fa[0] = 3.1;Q->fa[1] = 4.1;void * plink = P;*(ST*)(plink) = *Q; //plink要先強(qiáng)制轉(zhuǎn)換一下,目的是為了讓它先知道要覆蓋的大小//P的內(nèi)容被Q的內(nèi)容覆蓋cout << P->id << " " << P->fa[0] << " " << P->fa[1] << endl; return 0; }結(jié)果: world! 3.1 4.1

const限定符

①可用于不允許被修改的變量和形式參數(shù),數(shù)據(jù)保護(hù)
示例:char *strcpy(char *str1,const char *str2);

②聲明const變量時(shí)需要初始化
示例:const int stuNum = 100;

const和形式參數(shù)

用于限定函數(shù)形式參數(shù),以保護(hù)實(shí)參
示例:

void output(const double * pd) {printf(%d”, *pd); /* 允許 */*pd = 15.5 ; /* 不允許! */}

指向常量數(shù)據(jù)的指針(注意與指針常量區(qū)別)

①指針的值可以改變,無(wú)法通過(guò)指針修改指向的內(nèi)容

②關(guān)鍵字const放在指針類型前

示例:

int i, j, *q; const int * p; /* 等價(jià)于int const *p; */ p = &j; /* 允許 */ p = &i; /* 允許 */ i = 10; /* 允許 */ *p = 5 ; /* 不允許 */

指針常量

①指針常量又稱為常指針

②指針的值不能修改,指向的內(nèi)容可以修改

③關(guān)鍵字const放在“*”號(hào)和指針名之間

例如:

int var1,var2 ; int * const p = &var1 ; *p = 5 ; /* 允許 */ p = &var2 ; /* 不允許 */

總結(jié)

以上是生活随笔為你收集整理的C语言—指针高级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。