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中要用引用,,&。