---
title: "arrayer in och ut ur funktioner"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/28073-arrayer-in-och-ut-ur-funktioner"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "jockee"
published: "2001-08-13T17:45:00.000Z"
updated: "2001-08-14T19:29:00.000Z"
replies: 7
views: 528
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/28073-arrayer-in-och-ut-ur-funktioner"
---

# arrayer in och ut ur funktioner

## #1 — jockee, 2001-08-13T17:45Z

Undrar om det går att skicka arrayer in och ut ur funktioner?

Här är lite kod som jag försökte med, tacksam för hjälp:

int array\[1\];
// har en array som jag vill ändra lite med en funktion
array = doStuffWithArray(array);

funktionen är nåt liknande:
int doStuffWithArray(int array\[1\]) {
  array\[0\]=12;
  array\[1\]=9;

  return array;
}

det här fungerar inte, ny som jag är på det här förstår jag inte riktigt hur man gör rätt.
Raden jag får fel på är den med "array = doStuffWithArray(array);"

Felet är:
incompatible types in assignment of \`int' to \`int\[1\]'

Är detta helt åt skogen?

\[Redigerat av jockee den 13 aug 2001\]

Permalänk: https://www.webforum.nu/p/28073

## #2 — UlfT, 2001-08-13T20:09Z

\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>int array\[1\];
Jag förstår att du avsåg att deklarera en array med elementen 0 och 1. Men då gör man istället såhär:
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>int array\[2\];
dvs en array med två element. Din deklaration gav en array med bara ett element.

Efter ovanstående deklaration är variabeln array en pekare till första elementet i arrayen, dvs array\[0\]. Men båda elementen är allokerade i och med att du deklarerade array\[2\].

När du anropar doStuffWithArray() ska du skicka pekaren array. Det innebär att du måste deklarera argumentet som en pekare, i det här fallet en pekare till en int eftersom första elementet är en int:
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>int \* doStuffWithArray(int \* array)
{
array\[0\]=12;
array\[1\]=9;

return array; // Här valde du att returnera pekaren array, se hur jag har ändrat funktionsdeklarationen
// egentligen behövde du inte returnera något för funktionen ändrade inte på pekaren, utan på det pekaren pekade på
// Om du programmerat VB är du nog bekant med ByRef-argument. Det här är något liknande.
}

Permalänk: https://www.webforum.nu/p/401117

## #3 — jockee, 2001-08-14T00:25Z

Tack, är väldigt glad över svaret. :)

Undrar lite fortfarande, läste lite om pekare men undrar lite över funktionen.
Kollade på din kod och undrar lite över det det här:
int \* doStuffWithArray(int \* array)

Varför sätter man \* framför funktionsnamnet?
Känner att jag inte har full koll på hur man ska använda pekarna.

\[Redigerat av jockee den 14 aug 2001\]

Permalänk: https://www.webforum.nu/p/401118

## #4 — UlfT, 2001-08-14T08:25Z

\* framför funktionsnamnet är om man vill att funktionen ska returnera en pekare. Jämför med variabeldeklarationer:
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>int \* array; // pekare till en int
int \* func() // funktion som returnerar pekare till en int
Jag vill dock påpeka att i ditt exempel behöver du inte returnera någon array. Det är så att variabeln array innehåller en minnesadress. Den ändrar du aldrig på i din funktion. Däremot ändrar du på innehållet i det minnesblock som array pekar på. Efter den funktionen kommer array alltså fortsätta peka på samma minnesblock, men innehållet i minnesblocket är annorlunda. Du får räkna med att det tar lite tid att få full koll på pekare, men genom övande i c-programmering kommer du vänja dig. Man kommer inte ifrån pekare i vare sig c eller c++.

Permalänk: https://www.webforum.nu/p/401119

## #5 — PhOrPhEr, 2001-08-14T08:40Z

Jag kan inte låta bli att kommentera placeringen av stjärnan bara. :e

Alltså det funkar ju alldeles utmärkt som du skriver (int \* doStuffWithArray (int \* array))men det är svårt att se vad stjärnan tillhör på nåt sätt.. :)

Jag tycker nog att det borde se ut såhär: int \*doStuffWithArray(int \*array).

Jag gick 5-poängs C++ kurs i vintras och då ville vår lärare skilja på C och C++ genom att vid C skriva en pekardeklaration som jag gjort ovan och i C++ skriva int\* doStuffWithArray(int\* array).

Fast tja.. Smaken är ju som baken.. :e

Permalänk: https://www.webforum.nu/p/401120

## #6 — UlfT, 2001-08-14T09:16Z

Visst kan man ha stjärnan på flera sätt:
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>
int \*var; // \*var pekar på datatypen int
int\* var; // var är av datatypen heltalspekare

Båda två är ju förstås samma sak, det är en smaksak hur man ser det.

Hur motiverade din lärare sitt val med int \*var; i C och int\* var; i C++;?

Permalänk: https://www.webforum.nu/p/401121

## #7 — developer, 2001-08-14T19:06Z

Jag rekommenderar
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>int\* ptr1 = NULL; // bra
hellre än
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>int \*ptr2 = NULL; // dåligt

Den stilen använder bland annat C++ språkets "pappa" Bjarne Stroustrup. 
Motiveringen är att du deklarerar en pekare till en integer **int\*** och asterisken hör till variabeltypen. 
Samtidigt uppmanar jag att bara deklarera en variaber per rad, annars faller förstås mitt resonemang (**int\* a, b** är farligt - det är bara a som blir en pekare). Man vinner heller inget på att ha fler än 1 variabeldeklaration per rad.

Detta har tidigare debatterats på passagen, ursprungliga inlägget var  <http://debatt.passagen.se/html/500000000000002/500000000000067/10000000000945160.shtml> 
Min kommentar på  <http://debatt.passagen.se/html/500000000000002/500000000000067/10000000000945570.shtml>  och "Hampus" sakliga inlägg på  <http://debatt.passagen.se/html/500000000000002/500000000000067/10000000000946191.shtml>.

Jag är också nyfiken varför din lärare ville skriva olika i C och C++. (Vikten av att kunna C är i min mening inte längre särskilt stor annat än om man jobbar med mikroprocessorer då det fortfarande lever kvar. Det mesta skrivs nuförtiden i C++ eller andra objektorienterade språk. Jag vet ingen som längre jobbar med C för att det är det enda alternativet)

\[Redigerat av developer den 14 aug 2001\]

Permalänk: https://www.webforum.nu/p/401122

## #8 — PhOrPhEr, 2001-08-14T19:29Z

Tja.. Vi fick nog ingen motivering varför han tyckte så. Och jag är ju i trotsåldern så jag skriver inte så i vilket fall. :e  
Jag skriver (int \*foo) och kommer förmodligen alltid att göra det. Svårt att göra sig av med gamla vanor. :)

Permalänk: https://www.webforum.nu/p/401123

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/28073-arrayer-in-och-ut-ur-funktioner
