指針數組和數組指針和函數指針

文章目錄

  • 1.指針數組和數組指針
    • 1.int *p1[10];
    • 2.int (*p2)[10];
  • 2.函數指針
    • char *(*fun1)(char * p1,char *p2)
    • 函數指針的概念
    • 函數指針的作用:
      • 例子1 .調用方式
      • 例子2:(帶注釋)
      • 例子3
  • 3.做題的小技巧

1.指針數組和數組指針

1.int *p1[10];

int *p1[10];

指針數組:存儲指針的數組(數組的元素都是指針,數組所占字節
     由數組本身決定)

2.int (*p2)[10];

int (*p2)[10];

詳解

int (*) [10]`(指針類型)
p2`    (指針變量)

數組指針:指向數組的指針(32位系統下永遠是4個字節,他指向
     的數組占字節數未知)
注:()>[]>*
運算優先級速查鏈接
https://blog.csdn.net/csdn_kou/article/details/80139099

2.函數指針

char *(*fun1)(char * p1,char *p2)

函數指針的概念

char *(*fun1)(char * p1,char *p2)

詳解

char *(*)(char * p1,char *p2)(指針類型)
fun1(指針變量)

函數指針的作用:

例子1 .調用方式

char * fun(char *p1, char *p2)
{}
int main()
{char *(*p)(char * p1, char *p2);p = &fun;(*p)("aa", "nn");system("pause");return 0;
}

上面的例子我們還無法看出他的優勢。
函數指針數組

例子2:(帶注釋)

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>/*四種算法*/
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}void calc(int(*p)(int, int))
{//calc(int Add(int ,int )int ret = 0;int x = 0;int y = 0;printf("請輸入兩個操作數:>");scanf("%d%d", &x, &y);ret = p(x, y);// Add(x,y);printf("ret = %d\n", ret);
}int main()
{int (*p[5])(int, int) = {0, Add, Sub, Mul, Div};//指針變量p[5],內部5個元素,加減乘除int input = 0;do{scanf("%d", &input);if(input>=1 && input<=4)calc(p[input]);//calc(Add);//Add 指針類型是 int (*)(int ,int )elseprintf("退出\n");} while (input);
}

例子3

#include <stdio.h>#define  GET_MAX 	0
#define  GET_MIN 	1int get_max(int i, int j)
{return i > j ? i : j;
}int get_min(int i, int j)
{return i > j ? j : i;
}int compare(int i, int j, int flag)//1
{int ret;//這里定義了一個函數指針,就可以根據傳入的flag,靈活地決定其是指向求大數或求小數的函數//便于方便靈活地調用各類函數int(*p)(int, int);//2if (flag == GET_MAX)//3p = get_max;elsep = get_min;ret = p(i, j);//4return ret;
}int main()
{int i = 5, j = 10, ret;ret = compare(i, j, GET_MAX);printf("The MAX is %d\n", ret);ret = compare(i, j, GET_MIN);printf("The MIN is %d\n", ret);return 0;
}

3.做題的小技巧

  • 畫圖
  • 數組在內存中是連續存放,不是矩陣形式
  • 在32位系統下,不管什么類型的指針,永遠只占四個字節
  • 二維數組的內存分布a[i][j] = * (*(a+i)+j)
  • 函數本身沒有類型,函數的返回值才有類型。
    后續再補充

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382872.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用虛擬環境virtualenv 創建虛擬環境出現PermissionError: [Errno 13] Permission denied:

使用虛擬環境virtualenv 創建虛擬環境出現PermissionError: [Errno 13] Permission denied: 原因&#xff1a;虛擬環境安裝的目錄所屬用戶非當前用戶 解決辦法&#xff1a;將目錄及其文件的所有者改為當前用戶 解決命令&#xff1a;sudo chown -R 當前用戶 待更改用戶的目錄/ …

linux之父子進程的輸出

首先&#xff0c;我們來回憶一下父進程與子進程&#xff0c;前幾節講了如何創建子進程&#xff0c;像這樣的&#xff0c;pid_t id fork(); 這樣我們就創建好了一個子進程&#xff0c;然而fork()函數的返回值是什么呢&#xff1f;這里要記住&#xff1a;子進程返回0&#xff0c…

linux---談談vfork和fork的區別及exit與return

fork()&#xff1a;創建子進程的函數&#xff0c;是大家比較熟悉的吧。pid_t id fork(); 這里的vfork();也是創建子進程的函數。現在我們來剖析一下它們吧。 第一例&#xff1a; 先看一個fork()的例子哦。 對于fork()而言&#xff0c;創建子進程成功后直接打印出父子進程執…

在MySQL數據庫建立多對多的數據表關系

轉載自 https://blog.51cto.com/13145200724/1370753

C語言模擬實現標準庫函數之qsort()

qsort 編譯器函數庫自帶的快速排序函數。 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 參數解釋&#xff1a; void*base-待排序數組首地址size_t num-數組中待排序元素數量size_t width-各元素的占用空間大小int(__cde…

django contrib 包簡介

轉自 https://www.cnblogs.com/tianboblog/p/6955297.html

linux之管道

管道&#xff08;PIPE&#xff09;是linux中一個重要的通信方式&#xff0c;在進程中&#xff0c;我們通過從一個進程中讀取到的數據轉到另一個進程中的寫數據中&#xff0c;這時就要有不同的進程之間共享同一份資源&#xff0c;就是所謂的進程間通信。由于進程的特點是資源獨占…

把student a am i 變成 i am a student(兩種方法)

文章目錄#student a am i 變成 i am a student##方法1&#xff1a;指針#include <stdlib.h> #include <stdio.h> #include <string.h>void fanw(char *l, char *r) {char* left l;char* right r;char temp;while (left < right){temp *left;*left *ri…

關掉占用 某端口的進程

sudo fuser -k 8000/tcp 這樣和端口8000相關的進程就都關了。

linux之多線程(1)

我們之前講了進程&#xff0c;今天我們重新認識另外一個概念---線程。我們首先會想到的是進程和線程有什么區別和聯系&#xff0c;對吧&#xff1f;進程是由程序執行起來&#xff0c;跑在操作系統的&#xff0c;是系統進行資源分配和調度的基本單位。進程具有資源獨占性&#x…

C語言typedef與#define的區別

typedef和#define define 沒有參加編譯&#xff0c;在預處理的時候就被替換掉了。 typedef參加編譯和鏈接。typedef是重命名&#xff0c;可以為枚舉結構體等等重新命名&#xff0c;提高代碼整潔。 一、typedef的用法 C語言中&#xff0c;typedef常用來定義一個標識符及關鍵…

django models模型 內部類 class Meta 簡介

class Meta: #這個屬性是定義當前的模型類是不是一個抽象類。所謂抽象類是不會相應數據庫表的。一般我們用它來歸納一些公共屬性字段&#xff0c;然后繼承它的子類能夠繼承這些字段。abstractTrue #db_table是用于指定自己定義數據庫表名的db_table test#因為Django的管理方法…

阻斷血緣關系以及checkpoint文件清理

spark-sql讀寫同一張表&#xff0c;報錯Cannot overwrite a path that is also being read from 1. 增加checkpoint&#xff0c;設置檢查點阻斷血緣關系 sparkSession.sparkContext.setCheckpointDir("/tmp/spark/job/OrderOnlineSparkJob")val oldOneIdTagSql s&…

linux之睡眠函數(my_sleep)

我們在程序中&#xff0c;很多次用到sleep()函數&#xff0c;讓它睡眠幾秒后再執行該進程。今天呢&#xff0c;我要給大家實現一下sleep函數。 看看代碼哦&#xff1a; 運行結果&#xff1a; 結果中每隔三秒鐘&#xff0c;打印一條語句。實現了sleep(3)的功能。 關于sleep函數…

C語言 防止頭文件被多次引用

comm.h和comm.c是公共模塊。 test1.h和test1.c使用了公共模塊。 test2.h和test2.c使用了了公共模塊。 test.h和test.c使?用了了test1模塊和test2模塊。 這樣最終程序中就會出現兩份comm.h的內容。這樣就造成了了文件內容的重復。 1.方法1 文件開頭加上這一句就ok #prag…

python字符串切片操作

name abcdefghijk name[2:-1] cdefghijname[2:] cdefghijk # 第三個參數是步長 name[2:-1:2] cegi# 字符串反轉 name[::-1] name[-1::-1] kjihgfedcba kjihgfedcba

機器思維。一些讓我眼前一亮的算法。

用人腦相處了計算機處理數據的方式。而不是 人腦處理的方式—>用計算機的語言表達 人腦處理的方式—>計算機處理的方式—>用計算機的語言表達

python 之 __new__ 方法理解

python的new方法 使用場景不同效果也不一樣 一種是指定元類時候&#xff0c; metaclassMyType 類型 這種方式 在解釋器執行到 metaclassCrawlerProxyMetaclass 的時候&#xff0c; __new__方法就開始執行&#xff01; 這里的 __new__方法是用來創建類對象的 class CrawlerProx…

詳解強制類型轉換

今天談談類型轉換的問題吧&#xff0c;之前我們也遇到過類型轉換&#xff0c;比如c語言中這樣的賦值&#xff1a; 顯然&#xff0c;i和j是不同類型的變量&#xff0c;但是卻可以完成賦值&#xff0c;結果是這樣的&#xff1a; 其實它們是做了隱式的類型轉換&#xff0c;相當于&…

面試--輸入一堆隨機數(0-1000),這里面會有重復的數字,把他們去除掉。然后由大到小排列。

1.問題說明 11 10 20 40 32 67 40 20 89 300 400 15 10 15 20//只顯示1次 32 40//只顯示1次 67 89 300 400 正常的算法&#xff1a; 1.遍歷所有數組&#xff0c;去除掉重復的數字 2.使用XX排序法&#xff0c;進行數字的排序。 眼前一亮的機器算法 1.生成1-1000的數組&am…