程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c 函數傳入數組。

c 函數傳入數組。

編輯:關於C語言

php 裡面 直接 count($arr); 一個函數搞定, c裡面想判斷下數組的個數卻非常困難。 想到php是C寫的,那看看他的函數怎麼寫的不就行了。。。 哦,天啊,,事實比我想的要復雜的多。。。 1,首先源碼下載下來了。。嗯,php函數都是放ext目錄下的。不就一個count函數麼??肯定是function count,全局搜索吧。。。--哦,老大,你搜的是C代碼,C裡可沒有function   。那是void? 我想起來了,count返回整數類型,搜 int count(.. 2,在 ext\standard\array.c 裡面我找到了以下代碼。。 /* {{{ proto int count(mixed var [, int mode])    Count the number of elements in a variable (usually an array) */ PHP_FUNCTION(count) { zval *array; long mode = COUNT_NORMAL;   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) { return; }   switch (Z_TYPE_P(array)) { case IS_NULL: RETURN_LONG(0); break; case IS_ARRAY: RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC)); break; case IS_OBJECT: { #ifdef HAVE_SPL zval *retval; #endif /* first, we check if the handler is defined */ if (Z_OBJ_HT_P(array)->count_elements) { RETVAL_LONG(1); if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) { return; } } #ifdef HAVE_SPL /* if not and the object implements Countable we call its count() method */ if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) { zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval); if (retval) { convert_to_long_ex(&retval); RETVAL_LONG(Z_LVAL_P(retval)); zval_ptr_dtor(&retval); } return; } #endif } default: RETURN_LONG(1); break; } }   喝,這群人這代碼寫的,你可以直接扔一個對象進去,,不過我只在乎這行。。 case IS_ARRAY: RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));   嗯,看來要找php_count_recursive這個函數了。。 就在本文件裡。。 static int php_count_recursive(zval *array, long mode TSRMLS_DC) /* {{{ */ { long cnt = 0; zval **element;   if (Z_TYPE_P(array) == IS_ARRAY) { if (Z_ARRVAL_P(array)->nApplyCount > 1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected"); return 0; }   cnt = zend_hash_num_elements(Z_ARRVAL_P(array)); if (mode == COUNT_RECURSIVE) { HashPosition pos;   for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(array), &pos); zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **) &element, &pos) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos) ) { Z_ARRVAL_P(array)->nApplyCount++; cnt += php_count_recursive(*element, COUNT_RECURSIVE TSRMLS_CC); Z_ARRVAL_P(array)->nApplyCount--; } } }   return cnt; }   嗯,他們找我干活了,下次再找吧。。。這麼復雜的count還不如我自己寫個了........   以下代碼證明了我初始想驗證的觀點。。 #include <stdio.h> #include <stdlib.h> void changeArr(int arr[]);   int main(int argc, char *argv[]) {   int charr[2];   charr[0] = 1;   charr[1] = 2;     changeArr(charr);   printf("charr[0] = %i", charr[0]);   system("PAUSE");   return 0; }   void changeArr(int arr[]) {  arr[0] = 100; } 主要是這行  changeArr(charr);  當函數傳入數組時,,數組值被直接改變,,而不用像php中要用引用,,&。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved